Php как найти остаток от деления

Арифметические операторы

Помните школьные основы арифметики? Описанные ниже операторы работают так же.

Арифметические операции

Пример Название Результат
+$a Идентичность Конвертация $a в int или
float, что более подходит.
-$a Отрицание Смена знака $a.
$a + $b Сложение Сумма $a и $b.
$a — $b Вычитание Разность $a и $b.
$a * $b Умножение Произведение $a и $b.
$a / $b Деление Частное от деления $a на $b.
$a % $b Деление по модулю Целочисленный остаток от деления $a на $b.
$a ** $b Возведение в степень Возведение $a в степень $b.

Операция деления («/») возвращает число с плавающей точкой, кроме случая,
когда оба значения являются целыми числами (или строками, которые преобразуются
в целые числа), которые делятся нацело — в этом случае возвращается целое значение.
Для целочисленного деления используйте intdiv().

При делении по модулю операнды преобразуются в целые числа (int) (путём удаления дробной части)
до начала операции. Для деления по модулю чисел с плавающей точкой используйте
fmod().

Результат операции остатка от деления % будет иметь тот же знак,
что и делимое — то есть, результат $a % $b
будет иметь тот же знак, что и $a. Например:


<?phpecho (5 % 3)."n"; // выводит 2
echo (5 % -3)."n"; // выводит 2
echo (-5 % 3)."n"; // выводит -2
echo (-5 % -3)."n"; // выводит -2?>

There are no user contributed notes for this page.

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

fmodВозвращает дробный остаток от деления по модулю

Описание

fmod(float $num1, float $num2): float

Список параметров

num1

Делимое.

num2

Делитель.

Возвращаемые значения

Остаток от операции деления
num1/num2

Примеры

Пример #1 Пример использования fmod()


<?php
$x
= 5.7;
$y = 1.3;
$r = fmod($x, $y);
// $r равно 0.5, потому что 4 * 1.3 + 0.5 = 5.7
?>

Смотрите также

  • / — деление с плавающей точкой
  • % — целочисленный остаток
  • intdiv() — целочисленное деление

jphansen at uga dot edu

18 years ago


fmod() does not mirror a calculator's mod function. For example, fmod(.25, .05) will return .05 instead of 0 due to floor(). Using the aforementioned example, you may get 0 by replacing floor() with round() in a custom fmod().

<?
function fmod_round($x, $y) {
    $i = round($x / $y);
    return $x - $i * $y;
}

var_dump(fmod(.25, .05)); // float(0.05)
var_dump(fmod_round(.25, .05)); // float(0)
?>


cory at lavacube dot net

17 years ago


I don't believe that is correct.

Try this out using your patch:
<?phpecho duration( mktime(0, 0, 0, 1, 0, 2006)-time() );?>

As of right now, this will read:
1 month, 22 days, 24 hours, 49 minutes, 15 seconds

Which is completely incorrect. Seeing as how it is the 9th of December.

The real real flaw here is how the 'year' and 'month' periods are calculated. As most months vary in length...

Thank you very much SnakeEater251 for pointing this out.

The quickest way to get slightly more accurate results, is to use averages based on one "true" year, which is 365.25 days.

Change the year and month to:
      'year'       => 31557600, // one 'true year' (365.25 days)
      'month'    => 2629800, // one 'true year' divided by 12 :-)

I will work on developing a true fix, for pin-point accuracy. ;-)

- Cory Christison


dan danschafer net

4 years ago


WARNING: Due to how floating point numbers work, fmod() and any simple alternatives are problematic when there is either a massive orders of magnitude different between the input $x and $y, or the input and output values. If you need to work with large numbers or arbitrary precision, it is best to work with something like BC Math or GMP.

When working around fmod()'s problems, remember that floor() always goes towards -INF, not 0. This causes a commonly proposed fmod() alternative to only work with positive numbers:
<?php
function fmod_positive_only($x, $y) {
    return
$x - floor($x/$y) * $y;
}
?>
Given these simplistic input values:
fmod_positive_only(-5, 3) = 1 (wrong)
-5 % 3 = -2 (correct)

Correctly removing the decimal part of the quotient can be achieved with either casting to an int (always goes towards zero) or dynamically choosing ceil() or floor(). Dynamically choosing floor or ceil in an attempt to keep precision is overkill. If your $x and $y values are so different that it suffers from an overflow problem when casting, it was probably going to have precision problems anyway (see warnings below).

<?php
function fmod_overkill($x, $y) {
    if (!
$y) { return NAN; }
   
$q = $x / $y;
   
$f = ($q < 0 ? 'ceil' : 'floor');
    return
$x - $f($q) * $y;
}
?>

This is the "best" alternative for fmod() when given "normal" numbers.
<?php
function fmod_alt($x, $y) {
    if (!
$y) { return NAN; }
    return
floatval($x - intval($x / $y) * $y);
}
?>

WARNING: Even when you get a non-zero response, know your input numbers and when fmod() can go wrong. For large values or depending on your input variable types, float still may not contain enough precision to get back the correct answer. Here are a few problems with fmod() and their alternatives.

PHP_INT_MAX = 9223372036854775807
fmod(PHP_INT_MAX, 2) = 0 (wrong)
fmod_alt(PHP_INT_MAX, 2) = 0 (wrong)
PHP_INT_MAX % 2 = 1 (correct)

fmod(PHP_INT_MAX, PHP_INT_MAX - 1) = 0 (wrong)
fmod_alt(PHP_INT_MAX, PHP_INT_MAX - 1) = 1 (correct)
fmod_alt(PHP_INT_MAX, PHP_INT_MAX - 1.0) = 0 (wrong)
PHP_INT_MAX % (PHP_INT_MAX - 1) = 1 (correct)
PHP_INT_MAX % (PHP_INT_MAX - 1.0) = 9223372036854775807 (wrong)

fmod(PHP_INT_MAX, 131) =  98 (wrong)
fmod_alt(PHP_INT_MAX, 131) = 359 (wrong)
fmod_positive_only(PHP_INT_MAX, 131) = 0 (wrong)
PHP_INT_MAX % 131 = 97 (correct)


alex at xelam dot net

19 years ago


Integer Modulo

If you want the remainder of the division of two Integers rather than Floats, use "%"; eg:

<?php
$a
= 4;
$b = 3;

print(

$a % $b);
?>

Will output "1".


dePijd

13 years ago


This class ran through several unit tests and fixes all failures found in bugs.php.net

<?php
abstract class MyNumber {
    public static function
isZero($number, $precision = 0.0000000001)
    {
       
$precision = abs($precision);
        return -
$precision < (float)$number && (float)$number < $precision;
    }
    public static function
isEqual($number1, $number2)
    {
        return
self::isZero($number1 - $number2);
    }
    public static function
fmod($number1, $number2)
    {
       
$rest = fmod($number1, $number2);
        if (
self::isEqual($rest, $number2)) {
            return
0.0;
        }
        if (
mb_strpos($number1, ".") === false) {
           
$decimals1 = 0;
        } else {
           
$decimals1 = mb_strlen($number1) - mb_strpos($number1, ".") - 1;
        }
        if (
mb_strpos($number2, ".") === false) {
           
$decimals2 = 0;
        } else {
           
$decimals2 = mb_strlen($number2) - mb_strpos($number2, ".") - 1;
        }
        return (float)
round($rest, max($decimals1, $decimals2));
    }
}
?>


KRAER

9 years ago


To create a list of primes in a bash based on php wich can be resumed after breaking I did use fmod() and some snippets offered by two more users here on php comments.

This will output :
"prime;difference-between-last-and-current-prime"

So credit goes to them. I only did the logfile output.

This will function up to whatever fmod supports as highest value. Just enter the $end value. And do a touch to the logfile followed by chmod 666 so php can access it.

<?php
function tailCustom($filepath, $lines = 1, $adaptive = true) {// Open file
       
$f = @fopen($filepath, "rb");
        if (
$f === false) return false;// Sets buffer size
       
if (!$adaptive) $buffer = 4096;
        else
$buffer = ($lines < 2 ? 64 : ($lines < 10 ? 512 : 4096));// Jump to last character
       
fseek($f, -1, SEEK_END);// Read it and adjust line number if necessary
        // (Otherwise the result would be wrong if file doesn't end with a blank line)
       
if (fread($f, 1) != "n") $lines -= 1;// Start reading
       
$output = '';
       
$chunk = '';// While we would like more
       
while (ftell($f) > 0 && $lines >= 0) {// Figure out how far back we should jump
           
$seek = min(ftell($f), $buffer);// Do the jump (backwards, relative to where we are)
           
fseek($f, -$seek, SEEK_CUR);// Read a chunk and prepend it to our output
           
$output = ($chunk = fread($f, $seek)) . $output;// Jump back to where we started reading
           
fseek($f, -mb_strlen($chunk, '8bit'), SEEK_CUR);// Decrease our line counter
           
$lines -= substr_count($chunk, "n");

        }

// While we have too many lines
        // (Because of buffer size we might have read too many)
       
while ($lines++ < 0) {// Find first newline and remove all text before that
           
$output = substr($output, strpos($output, "n") + 1);

        }

// Close file and return
       
fclose($f);
        return
trim($output);

    }

function

isPrime( $num )
{
    for(
$i = 2; $i*$i <= $num; $i++ )
        if( !
fmod($num,$i) )
            return
FALSE;

    return

TRUE;
}
$logfile = 'prim_save.log';$lastline = explode(";", tailCustom($logfile));
$begin = ($lastline[0] +1);
$lastprime = $lastline[0];$end = 999999999999999999999999999999999999; $fp = fopen($logfile, 'a');
//Lineformat    $i.';'.$difference.';'."n"for($i = $begin; $i<$end; $i++)
{
    if(
isPrime($i) == TRUE)
    {
       
$difference = $i - $lastprime;
       
fputs($fp,$i.';'.$difference.';'."n");
       
$lastprime = $i;
    }
}
fclose($fp);
?>


Adrien Gibrat

9 years ago


There is an elegant way to do compute gcm :
https://en.wikipedia.org/wiki/Greatest_common_divisor

    // Recursive function to compute gcd (euclidian method)
    function gcd ($a, $b) {
        return $b ? gcd($b, $a % $b) : $a;
    }
    // Then reduce any list of integer
    echo array_reduce(array(42, 56, 28), 'gcd'); // === 14

If you want to work with floating points, use approximation :

    function fgcd ($a, $b) {
        return $b > .01 ? fgcd($b, fmod($a, $b)) : $a; // using fmod
    }
    echo array_reduce(array(2.468, 3.7, 6.1699), 'fgcd'); // ~= 1.232

You can use a closure in PHP 5.3 :

    $gcd = function ($a, $b) use (&$gcd) { return $b ? $gcd($b, $a % $b) : $a; };


picaune at hotmail dot com

20 years ago


NAN (.net Equivalent = Double.NaN) means "Not-a-Number".
Some ways to get NaN are modulo 0, and square root of 0.

nospam at neonit dot de

6 years ago


Note that fmod does not behave like a similar function written in PHP itself does due to the lack of fixing floating point representation errors.

Have a look at this:
<?php
var_dump
(10 / (10 / 3) === 3.0); // bool(true)
var_dump(fmod(10, 10 / 3)); // float(3.3333333333333)
var_dump(fmod(10, 10 / 3) < 10 / 3); // bool(true)
?>

Internally there is no way of exactly representing the result of 10 / 3, so it will always be a bit above or below the actual result. In this case, the example proves it being a bit above the actual result.

PHP seems quite good at auto-fixing floating point representation errors so they behave like the user would expect it. That's why the first line yields true, although the result is slightly below 3 (like 2.9999999999[something]). I failed to trick PHP into rounding or cropping the result to 2.

However, fmod seems to not apply these fixes during calculations. From 10 / 3 it gets a value slightly below 3, floors it to 2 and returns 10 - 2 * 10 / 3, which is slightly less than the actual result of 10 / 3, but looks like 10 / 3 (third line).

Unfortunately, this is not the expected result. See other notes for high quality fixes.


timo underscore teichert at yahoo dot de

8 years ago


The behaviour of this function seems to have changed over time.

<?phpecho fmod(3,5);
// php 5.3.2 outputs -2
// php 5.3.8 outputs 3
echo fmod(2,5);
// php 5.3.2 outputs 2
// php 5.3.8 outputs 2
?>

- Timo


matrebatre

15 years ago


I always use this:

function modulo($n,$b) {
return $n-$b*floor($n/$b);
}

And it appears to work correctly.


cory at simplesystems dot ca

17 years ago


Just a note on the previous note by Ryan Means:

Instead of using explode() to get the number before the decimal point, would be to use floor()... floor() rounds fractions down, which is exactly what is needed.

His same example using floor();

<?PHP
$totalsec
=XXXXXXX; //Replace the X's with a int value of seconds$daysarray = floor( $totalsec/86400 );$partdays = fmod($totalsec, 86400);
$hours = floor( $partdays/3600 );$parthours = fmod($partdays, 3600);
$min = floor( $parthours/60 );$sec = fmod($parthours, 60);

echo

"days " . $days . "<br>";
echo
"hours " . $hours . "<br>";
echo
"minutes " . $min . "<br>";
echo
"seconds " . $sec . "<br>";
?>


rocan

18 years ago


john at digitizelife dot com:

Well not sure how your comment applys to fmod..

but their is a sure simpler way of coping with situations like this..

its called a bit field (bit masking)

e.g.

/* Categories */
bin     dec   cat
0001 - 1 - Blue
0010 - 2 - Red
0100 - 4 - Green 
1000 - 8 - Yellow

/* Permissions */
0010 - 2   - Bob
0101 - 5    - John
1011 - 11  - Steve
1111-  15 - Mary

to find out the permissions for each user you simple need to do a bitwise AND 

$steve_auth=11;

function get_perm($auth)
{
    $cats["Blue"]=1;
    $cats["Red"]=2;
    $cats["Green"]=4;
    $cats["Yellow"]=8;
    $perms=array();
    foreach($cats as $perm=>$catNum)
    {
          if($auth & $catNum)
                $perms[$perm]=true;

    }

    return $perms;
}

print_r(get_perm($steve_auth));
/*
returns
Array
(
    [Blue] => 1
    [Red] => 1
    [Yellow] => 1
)
*/

This is far simpler than your prime number idea, in fact you dont even need a function in any tests for the permmsions on a user you can do them directly using the bitwise and operator.

You may want to read the following

http://en.wikipedia.org/wiki/Bitmask
http://uk2.php.net/manual/en/language.operators.bitwise.php


konstantin at rekk dot de

19 years ago


If you need to reduce an integer to zero if zero and 1 if not, you can use

$sign = (integer)(boolean)$integer;

instead of

$sign = $integer > 0 ? 1 : 0;

it is faster from 100 operations on (at least on my machine).


cory at lavacube dot net

17 years ago


A more formal way for generating duration strings:

<?phpfunction duration( $int_seconds=0, $if_reached=null )
{
   
$key_suffix = 's';
   
$periods = array(
                   
'year'        => 31556926,
                   
'month'        => 2629743,
                   
'day'        => 86400,
                   
'hour'        => 3600,
                   
'minute'    => 60,
                   
'second'    => 1
                   
);// used to hide 0's in higher periods
   
$flag_hide_zero = true;// do the loop thang
   
foreach( $periods as $key => $length )
    {
       
// calculate
       
$temp = floor( $int_seconds / $length );// determine if temp qualifies to be passed to output
       
if( !$flag_hide_zero || $temp > 0 )
        {
           
// store in an array
           
$build[] = $temp.' '.$key.($temp!=1?'s':null);// set flag to false, to allow 0's in lower periods
           
$flag_hide_zero = false;
        }
// get the remainder of seconds
       
$int_seconds = fmod($int_seconds, $length);
    }
// return output, if !empty, implode into string, else output $if_reached
   
return ( !empty($build)?implode(', ', $build):$if_reached );
}
?>

Simple use:
<?phpecho duration( mktime(0, 0, 0, 1, 1, date('Y')+1) - time(), 'Some fancy message to output if duration is already met...' );?>

Enjoy. :-)


ysangkok at gmail dot com

15 years ago


Please note that this:
<?php
function custom_modulo($var1, $var2) {
 
$tmp = $var1/$var2;

  return (float) (

$var1 - ( ( (int) ($tmp) ) * $var2 ) );
}
$par1 = 1;
$par2 = 0.2;

echo

"fmod:          ";
var_dump(fmod ( $par1 , $par2 ));
echo
"custom_modulo: ";
var_dump(custom_modulo ( $par1 , $par2 ));
?>

gives this:

fmod:          float(0.2)
custom_modulo: float(0)

Fmod does not deliver the desired result, therefore I made my own.


radoslaw dot roszkowski at gmail dot com

4 years ago


Do not relly on that function, for example:

$a = "7.191"
$b =  "2.397000"

if(fmod(floatval($a), floatval($b)) === 0.0) {
..
//is false, becouse
//float(4.4408920985006E-16) != 0.0


SnakeEater251

17 years ago


Note on the code given by cory at lavacube dot net.
You will recieve better results by not using floor and using round instead. As you continue increasing to larger amounts of time you will notice that the outputted time is off by large amounts.

so instead of $temp = floor( $int_seconds / $length );
we would use  $temp = round( $int_seconds / $length );

<?phpfunction duration( $int_seconds=0, $if_reached=null )
{
  
$key_suffix = 's';
  
$periods = array(
                  
'year'        => 31556926,
                  
'month'        => 2629743,
                  
'day'        => 86400,
                  
'hour'        => 3600,
                  
'minute'    => 60,
                  
'second'    => 1
                  
);// used to hide 0's in higher periods
  
$flag_hide_zero = true;// do the loop thang
  
foreach( $periods as $key => $length )
   {
      
// calculate
      
$temp = round( $int_seconds / $length );// determine if temp qualifies to be passed to output
      
if( !$flag_hide_zero || $temp > 0 )
       {
          
// store in an array
          
$build[] = $temp.' '.$key.($temp!=1?'s':null);// set flag to false, to allow 0's in lower periods
          
$flag_hide_zero = false;
       }
// get the remainder of seconds
      
$int_seconds = fmod($int_seconds, $length);
   }
// return output, if !empty, implode into string, else output $if_reached
  
return ( !empty($build)?implode(', ', $build):$if_reached );
}
?>


linkboss at gmail dot com

13 years ago


You can also use the modulo operator '%', which returns the same result :

<?php
$var1
= 5;
$var2 = 2;

echo

$var1 % $var2; //Returns 1
echo fmod($var1,$var2); //Returns the same
?>


verdy_p

10 years ago


Note that fmod is NOT equivalent to this basic function:

<?php

function modulo($a, $b) {

    return
$a - $b * floor($a / $b);

}

?>



because fmod() will return a value with the same sign as $a. In other words the floor() function is not correct as it rounds towards -INF instead of towards zero.

To emulate fmod($a, $b) the correct way is:

<?php

function fmod($a, $b) {

   return
$a - $b * (($b < 0) ? ceil($a / $b) : floor($a / $b)));

}

?>



Note that both functions will throw a DIVISION BY ZERO if $b is null.

The first function modulo() above is the mathematical function which is useful for working on cyclic structures (such as calender computions or trignonometric functions :

- fmod($a, 2*PI) returns a value in [0..2*PI) if $a is positive

- fmod($a, 2*PI) returns a value in [-2*PI..0] if $a is negative

- modulo($a, 2*PI) returns a value always in [0..2*PI) independantly of the sign of $a


Помните школьные основы арифметики? Описанные ниже операторы работают так же.

Арифметические операции

Пример Название Результат
-$a Отрицание Смена знака $a.
$a + $b Сложение Сумма $a и $b.
$a — $b Вычитание Разность $a и $b.
$a * $b Умножение Произведение $a и $b.
$a / $b Деление Частное от деления $a на $b.
$a % $b Деление по модулю Целочисленный остаток от деления $a на $b.
$a ** $b Возведение в степень Результат возведения $a в степень $b. Добавлен в PHP 5.6.

Операция деления («/») возвращает число с плавающей точкой, кроме случая,
когда оба значения являются целыми числами (или строками, которые преобразуются
в целые числа), которые делятся нацело — в этом случае возвращается целое значение.

При делении по модулю операнды преобразуются в целые числа (удалением дробной части)
до начала операции.

Результат операции остатка от деления % будет иметь тот же знак,
что и делимое — то есть, результат $a % $b
будет иметь тот же знак, что и $a. Например:


<?phpecho (3)."n";           // выводит 2
echo (% -3)."n";          // выводит 2
echo (-3)."n";          // выводит -2
echo (-% -3)."n";         // выводит -2?>

Также вы можете ознакомиться с разделом документации
Математические функции.

Вернуться к: Операторы

При написании кода в PHP есть задачи, которые встречаются чаще остальных или просто как-то выделяются из общего множества. В этой статье поговорим о некоторых из них.

Тут собрана лишь малая часть, и наверное это не последняя статья на тему несложных популярных задачек в PHP. Кроме того, я планирую дополнять эту статью…

В общем, не буду никого ни за что тянуть и перейду сразу к кодам, которые, я надеюсь, будут полезны новичкам: кто что для себя найдет — все ваше smile

Короткая запись операторов присваивания

Когда нужно что-то прибавить, отнять или объединить, то для краткости можно использовать сокращения в операторе = — операторе присваивания:

// полная запись, а под ней тоже самое только кратко
$a = $a + 1;  $a = $a + 5;  $a = $a - $b;  $a = $a . 'текст';
$a++;         $a += 5;      $a -= $b;      $a .= 'текст';

Время выполнения PHP скрипта

Build In Post

Иногда бывает нужно замерить время выполнения отельного куска кода в PHP. Сделать это не сложно, ниже разберемся как.

Простой вариант

Замерить скорость выполнения какой-то отдельной его части PHP кода, можно с помощью встроенной в PHP функции microtime( true ). Функция вернет UNIX штамп времени в микросекундах. Параметр true говорит функции вернуть число, а не строку, чтобы можно было потом просто отнять одно число от другого.

Логика проста: сначала замеряем текущее время в микросекундах, выполняем код, опять замеряем текущее время и высчитываем разницу времени — эта разница и будет временем выполнения кода. С помощью функции sprintf() форматируем результат в более читаемый формат.

$start = microtime( true );

get_bloginfo( 'homeurl' ); // какой-то код

$diff = sprintf( '%.6f sec.', microtime( true ) - $start );

echo "Время выполнения: $diff"; // Время выполнения: 0.000014 sec.

Вариант посложнее

Для измерения скорости работы PHP кода, когда-то написал такую функцию:

/**
 * Считает время выполнения PHP кода (в секундах).
 *
 *     exec_time();
 *     // код
 *     echo exec_time('get') .' сек.'; //> 0.03654 сек.
 *
 * @version 3.4.5
 *
 * @param string $phase       run             - включает подсчет: первый раз или после паузы (по умолчанию).
 *                            start           - очищает все кэши и включает подсчет - clear & run.
 *                            get             - получает разницу, между предыдущим вызовом функции.
 *                            getall|end|stop - получает разницу, между первым вызовом функции (run).
 *                            pause           - временная остановка подсчета. exec_time() для продолжения.
 *                            clear           - полностью очищает результат. exec_time() для начала нового подсчета.
 * @param int    $round       До скольки знаков после запятой округлять результат.
 *
 * @return float|void Example 0.03654
 */
function exec_time( $phase = 'run', $round = 6 ){
	static $prev_time, $collect;

	if( 'start' === $phase ){
		$collect = $prev_time = 0;
	}
	elseif( 'clear' === $phase ){
		return $collect = $prev_time = 0;
	}

	list( $usec, $sec ) = explode( ' ', microtime() );
	$mctime = bcadd( $usec, $sec, 8 );

	if( $prev_time ){
		$exectime = $mctime - $prev_time; // bcsub( $mctime, $prev_time, 8 );
		$collect  += $exectime; // bcadd( $collect, $exectime, 8 );
	}
	$prev_time = $mctime;

	if( 'pause' === $phase ){
		$prev_time = 0;
	}
	elseif( 'get' === $phase ){
		return round( $exectime, $round );
	}
	elseif( false !== strpos( 'getall end stop', $phase ) ){
		return round( $collect, $round );
	}
}

Если замеряете отдельные быстрые функции, например: __(), то можно повторять выполнение для наглядности. Например, замерим работу __():

exec_time();

for( $i=1; $i<50000; $i++ ){
	$r = __( 'Settings', 'default' );
}

echo exec_time('get') .'сек.'; // 0.51650 сек.

Округление дробных чисел

Округление до целых

Чтобы округлить число в php существует несколько функций:

  • round($num) — округляет число в большую или меньшую сторону в зависимости от значения дробной части. Если дробная часть больше или равна пяти, то округлит в большую сторону, иначе в меньшую.

  • ceil($num) — независимо от дробной части, округляет в большую сторону.

  • floor($num) — независимо от дробной части, округляет в меньшую сторону.
// round
echo round( 5.2 ); //> 5
echo round( 5.5 ); //> 6
echo round( 5.6 ); //> 6

// ceil
echo ceil( 5.1 );  //> 6

// floor
echo floor( 5.9 ); //> 5

Округление до дробных

Для округления чисел, до определенного количество знаков после запятой, используем функцию round(). Во втором параметре нужно указать сколько оставить знаков после запятой.

echo $round = round( 5.555, 1 ); //> 5.6

echo $round = round( 5.555, 2 ); //> 5.56

Округление последнего числа происходит как в математики: если следующее больше или равно 5 то в большую сторону, в остальных случаях в меньшую…

Целая часть и остаток от деления чисел

Чтобы получить целую часть от деления можно воспользоваться функцией intval() или префиксом (int).

$celoe = intval(5 / 2); //> 2
$celoe = (int) (5 / 2); //> 2

Чтобы получить остаток от деления можно воспользоваться оператором %:

$ostatok = (5 % 2); //> 1

Четное число или нет — проверка в PHP (остаток от деления)

Чтобы узнать четное число или нет, нужно разделить его на 2 и проверить нет ли остатка… А для определения остатка от деления используется арифметический оператор — %.

$a = 11;

// есть остаток
if ( $a % 2 ) {
	echo '$a не четное';
}
// нет остатка
else {
	echo '$a четное';
}

Получаем остаток:

$ostatok = 5 % 2; //> 1
$ostatok = 4 % 2; //> 0
$ostatok = 10 % 6; //> 4

Числа кратные к N или каждый N-ый блок в цикле

Нужно разделить число на число и если остатка нет, то первое число делиться нацело на второе, а значит кратное.

$num = 21;
$n   = 3;
if( ! ($num % $n) ){
	echo "$num кратно $n";
}

Где применить эту кратность?

Допустим, есть цикл записей и нужно к каждому третьему блоку добавить отдельный css класс. Тут-то кратность нам и поможет.

$i = 1;
foreach( $posts a $post ){
	if( ! ($i++ % 3) ){
		// каждый третий блок в цикле
	}
}

Форматирование чисел (денег) в PHP

Для удобного восприятия числа или денежные велечины, лучше выводить с разеделением тысячных групп. Например 9864 понятнее смотрится так: 9 864. Для такого форматирования в PHP есть готовые фукнции:

number_format( $number, $decimals = 0 )
number_format( $number, $decimals = 0, $dec_point = ‘.’ , $thousands_sep = ‘,’ )

Форматирует число с разделением групп.

  • number(обязательный)
    Число, которое нужно отформатировать.

  • decimals
    Сколько знаков после запятой показывать.

  • dec_point
    Разделитель для дробной части.

  • thousands_sep
    Разделитель тысяч.
// английский формат (по умолчанию)
echo number_format( 5555 ); //> 5,555

// русский формат
echo number_format( 5555, 0, ',', ' '); //> 5 555

// французский формат
echo number_format( 5555.55, 2, ',', ' '); //> 5 555,55

Для вывода денежных величин используйте похожую функцию money_format()

Как получить ключи или значения ассоциативного PHP массива

Чтобы получить только ключи или только значения ассоциативного массива можно воспользоваться двумя php функциями: array_keys() и array_values(). Они возвращают простой индексный массив, содержащие все ключи или значения соответственно.

$array = array(
	'key_1' => 'val_1',
	'key_2' => 'val_2',
	'key_3' => 'val_3',
	'key_4' => 'val_4',
	'key_5' => 'val_5'
);

// получение всех ключей массива
$keys = array_keys( $array );
/* Array(
	[0] => key_1
	[1] => key_2
	[2] => key_3
	[3] => key_4
	[4] => key_5
)*/

// получение всех значений массива
$values = array_values( $array );
/* Array(
	[0] => val_1
	[1] => val_2
	[2] => val_3
	[3] => val_4
	[4] => val_5
)*/

Это может пригодится когда нужно сделать поиск по ключам массива. В PHP такой встроенной функции нет.

Создаем массив из диапазона чисел или букв

Допустим, нужно заполнить пустой массив элементами: числами от 1 до 5 или буквами от a до f.

На такой случай в php есть функция range( $start, $end, $step = 1 ). Она принимает два обязательных и один не обязательный параметр. Обязательные, указывают диапазон, из которого будет заполнен массив, а необязательный определяет шаг между элементами.

$array = range(1, 10);
/* Array(
	[0] => 1
	[1] => 2
	[2] => 3
	[3] => 4
	[4] => 5
	[5] => 6
	[6] => 7
	[7] => 8
	[8] => 9
	[9] => 10
)*/

$array = range(5, -5, 2);
/* Array(
	[0] => 5
	[1] => 3
	[2] => 1
	[3] => -1
	[4] => -3
	[5] => -5
)*/

$array = range('a', 'f');
/* Array(
	[0] => a
	[1] => b
	[2] => c
	[3] => d
	[4] => e
	[5] => f
)*/

$array = range('z', 'a', 3);
/* Array(
	[0] => z
	[1] => w
	[2] => t
	[3] => q
	[4] => n
	[5] => k
	[6] => h
	[7] => e
	[8] => b
)*/

Как получить максимальное или минимальное число из массива в PHP

Для определения максимального и минимального числа в php есть две удобные функции: min() и max(). Они могут принимать любое количество чисел и возвращать минимальное или максимально из них.

Также можно передать массив из чисел, тогда мин. или макс. число будет выбрано из значений массива.

// Пример 1
$min = min( 1, 6 ); //> 1
$max = max( 1, 6 ); //> 6

// Пример 2
$min = min( 1, 2, -5, 6, 0, -8, 7 ); //> -8
$max = max( 1, 2, -5, 6, 0, -8, 7 ); //> 7

// Пример 3 - массивы
$min = min( [1, 6] ); //> 1
$max = max( [1, 6] ); //> 6

Как получить часть строки (подстроку)

Чтобы получить подстроку можно использовать: substr(), iconv_substr() или mb_substr().

Все эти функции одинаковые, если нужно обрабатывать латиницу. А отличия начинаются когда нужно обработать например кириллицу или другой язык, тут подходят только: mb_substr() и iconv_substr(), потому что в них можно указать кодировку и они работают с символами в указанной кодировке.

Однако нужно знать, что скорость их работы в разы ниже: substr() работает с одинаковой скоростью для строки любой длинны. А вот mb_substr() и iconv_substr() работают тем медленнее чем длине строка в них указывается… В среднем они в 5-10 раз медленнее, однако альтернатив нет, если нужно обработать кириллицу, придется использовать их…

// синтаксис:
// mb_substr ( $string, $start, $length, $encoding )

$str = "Поиск текстов";

// 3 символа начиная с третьего (отсчет идет от нуля)
$sub_1 = mb_substr( $str, 2, 3 ); // обычно кодировку указывать не обязательно...

// Берем подстроку, начиная с первого символа и до третьего с конца
$sub_2 = mb_substr( $str, 6, -2, 'utf-8' );

// результат
echo $sub_1 .' - '. $sub_2; //> бой - текст

Всевозможные варианты:

// Латиница
$str = 'abcdef';

echo substr( $str, 1);     // bcdef
echo substr( $str, 1, 3);  // bcd
echo substr( $str, 0, 4);  // abcd
echo substr( $str, 0, 8);  // abcdef
echo substr( $str, -1, 1); // f

// Кириллица
$str = 'абвгдеж';

echo mb_substr( $str, 1);     // бвгдеж
echo mb_substr( $str, 1, 3);  // бвг
echo mb_substr( $str, 0, 4);  // абвг
echo mb_substr( $str, 0, 8);  // абвгдеж
echo mb_substr( $str, -1, 1); // ж

// с указанием кодировки, обычно это не обязательно
echo mb_substr( $str, 1, null, 'utf-8'); // бвгдеж
echo mb_substr( $str, 1, 3, 'utf-8');    // бвг
echo mb_substr( $str, 0, 4, 'utf-8');    // абвг
echo mb_substr( $str, 0, 8, 'utf-8');    // абвгдеж
echo mb_substr( $str, -1, 1, 'utf-8');   // ж

// iconv_substr(), обычно для нее нужно указать кодировку
// iconv_* медленнее чем mb_*
echo iconv_substr( $str, 1, 9999999, 'utf-8'); // бвгдеж
echo iconv_substr( $str, 1, 3, 'utf-8');       // бвг
echo iconv_substr( $str, 0, 4, 'utf-8');       // абвг
echo iconv_substr( $str, 0, 8, 'utf-8');       // абвгдеж
echo iconv_substr( $str, -1, 1, 'utf-8');      // ж

Количество символов в строке

Чтобы посчитать количество символов в строке есть три функции: strlen(), mb_strlen() и iconv_strlen(). Первая это родная функция PHP и она будет правильно работать только для латиницы. Две другие функции работают на основе подключаемого расширения для PHP и нужны для подсчета кириллицы или других языков. В них можно указать кодировку строки.

$str = 'Короткая строка.'; // тут 16 символов

// узнаем длину строки
echo strlen( $str ); // > 30

echo mb_strlen( $str ); // > 16
echo mb_strlen( $str, 'utf-8' ); // > 16

// iconv_* медленнее чем mb_*
echo iconv_strlen( $str ); // > 30
echo iconv_strlen( $str, 'utf-8' ); // > 16

Как посчитать сколько раз встречается одна строка в другой

Чтобы получить количество подстрок входящих в другую строку, можно воспользоваться двумя функциями: substr_count() и mb_substr_count() — для кириллицы.

$str = 'исходная строка для примера подсчета подстрок';
$sub_str = 'стр'; // искомая подстрока

// подсчет
$count    = substr_count( $str, $sub_str );            //> 2
$mb_count = mb_substr_count( $str, $sub_st );          //> 2
$mb_count = mb_substr_count( $str, $sub_str, "UTF-8"); //> 2

Удаление символов внутри строки

Сделать это можно многими способами, но самый простой это функция str_replace():

$str = 'Короткая строка.';

// заменим слово
echo str_replace( 'Короткая', 'Длинная', $str ); //> Длинная строка.

// удалим точку
echo str_replace( '.', '', $str ); //> Короткая строка

Удаление символов на концах строки

Чтобы прочистить концы строки от пробелов, табов и переносов есть функция trim(). Но не все знают что этой функции можно передать второй параметр, чтобы удалить с концов строки указанный символ.

Также, не все знают что есть аналогичные функции:

  • rtrim() — удаляет только справа строки
  • ltrim() — удаляет только слева строки
Удаление пустых символов на концах строки
$str = '     Короткая строка.  ';

// Удалим все пустые символы: таб, пробел, перенос
echo trim( $str ); // 'Короткая строка.'

// Удалим все пустые символы справа
echo rtrim( $str ); // '   Короткая строка.'

// Удалим слева
echo ltrim( $str ); // 'Короткая строка.  '
Удаление указанных символов в начале и конце строки
$str = '1122Короткая строка.2211';

// Удалим один символ
echo trim( $str, '1' ); // '22Короткая строка.22'

// Удалим несколько символов
echo trim( $str, '12' ); // 'Короткая строка.'
echo trim( $str, '21' ); // 'Короткая строка.'

// тоже самое только на концах строки

// Удалим справа
echo rtrim( $str, '1' ); // '1122Короткая строка.22'
echo rtrim( $str, '21' ); // '1122Короткая строка.'

// Удалим слева
echo ltrim( $str, '1' ); // '22Короткая строка.2211'
echo ltrim( $str, '21' ); // 'Короткая строка.2211'

Как перевернуть строку в PHP

Для вывода строки в обратном (реверсивном) порядке есть функция strrev(). Но, как и многие функции она не умеет работать с кириллицей. Альтернативных функций, вроде mb_strlen() нет. Поэтому давайте создадим свою:

// исходная строка
$string_lat = 'some string';
$string_cry = 'какая-то строка';

// переворачиваем
echo strrev( $string_lat ); //> gnirts emos

// переворачиваем строку в кодировке UTF-8
$mb_strrev = '';
for( $i = mb_strlen($string_cry, "UTF-8"); $i >= 0; $i-- ){
	$mb_strrev .= mb_substr( $string_cry, $i, 1, "UTF-8" );
}

echo $mb_strrev; //> акортс от-яакак

День недели и месяц по-русски на PHP

В php, функция date(), умеет выводить дату и время в огромном количестве форматов, но, к сожалению, вывод по-русски не предусмотрен. Поэтому для вывода дня недели или месяца по-русски, необходимо написать свою функцию.

Месяц по-русски

/**
 * функция для получения названия месяца по-русски.
 *
 * @param  integer [$num_month = false] Номер месяца, необязательный параметр, если параметр не задан,
 *                                      то функция вернет название текущего месяца.
 * @return string Название месяца
 */
function get_rus_month( $num_month = 0 ) {
	// если не задан номер месяца
	if( ! $num_month ) {
		$num_month = date('n'); // номер текущего месяца
	}

	// массив с названиями месяцев
	$monthes = array('', 'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь');

	return $monthes[ $num_month ];
}

// пример использования
echo get_rus_month(1); // Январь
echo get_rus_month();  // Апрель

День недели

## получает день недели по-русски
function get_rus_day(){
	 $days = array('Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота' );

	// номер дня недели: с 0 до 6. 0 - воскресенье, 6 - суббота
	$num_day = date('w');

	return $days[ $num_day ];
}

// пример использования
echo get_rus_day(); //> Среда

Есть что добавить? Милости прошу в комментарии…

Подскажите кто знает, вроде простенькая задачка а не могу понять

Сумма …… составляет 170, тогда остаток от деления этого числа на 11 равен 5.

Что имеется ввиду не могу понять, 170/11… 5 не получится…
Как из этого сделать функцию чтобы она возвращала из данного значения результат 5 ?

P.s. — это не задача для учебного заведения, просто делаю рандом функцию формирования isbn, тут как она формируется — https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B6%D…
суть знать контрольную цифру…


  • Вопрос задан

    более трёх лет назад

  • 13402 просмотра

170 % 11 === 5; // true

170 / 11 = 15,4545454545
15 целых + остаток.
11*15 = 165
170 = 11 * 15 + 5

Этот остаток 5 и получается оператором остатка от деления % (не путать с процентами)

Пригласить эксперта


  • Показать ещё
    Загружается…

29 мая 2023, в 01:21

5000 руб./за проект

28 мая 2023, в 22:23

1000 руб./за проект

28 мая 2023, в 21:40

125000 руб./за проект

Минуточку внимания

Понравилась статья? Поделить с друзьями:
  • Сближает скакательные суставы как исправить
  • Stop c0000218 windows xp как исправить
  • Жмж как найти жену
  • Как найти тупой коготь
  • Как найти каталог запчастей на дроме