Операции над числами в php

13 неожиданностей в PHP, о которых знают не все

Казалось бы, все знаешь, пишешь себе функции, используешь операторы и получаются у тебя крутые, быстрые и понятные конструкции кода, классы, например. Но в какой-то момент внезапно нарываешься на ситуацию, когда код работает так, как нужно ему, а не как ожидаешь ты и все это как-будто вопреки здравому смыслу. Но код никогда не ошибается, а ошибается наша логика.

Читайте также: PHP Синтаксис версий с 5.3 до 7.3

Ниже поговорим про интересные и неожиданные случаи в PHP.

explode() в 2 раза быстрее unserialize()

Если для сохраняемых чисел не важен тип (число), лучше хранить числа через запятую, чем их же сериализовать.

$str = 'a:7:{i:0;i:654;i:1;i:654;i:2;i:654;i:3;i:654;i:4;i:654;i:5;i:654;i:6;i:654;}';
$str2 = '654,654,654,654,654,654,654';
for( $i=1; $i 0.346 сек. explode(',', $str2); //> 0.151 сек. array_map('intval', explode(',', $str2) ); //> 0.424 сек.
}

isset() в 2 раза быстрее in_array()

Скорости очень быстрые, но если обрабатываются большие массивы, то есть смысл заюзать array_flip() и искать значение через isset():

$arr = array( 5, 6, 7, 8, 9, 10, 11, 12, 13 );
$arr2 = array_flip( $arr ); // [5] => 0 [6] => 1 [7] => 2 [8] => 3 [9] => 4 [10] => 5 [11] => 6 [12] => 7 [13] => 8 for( $i = 1; $i < 500000; $i++ ){ in_array( 5, $arr ); //> 0.03150 сек. isset( $arr2[5] ); //> 0.01552 сек.
}

Точное сравнение

PHP язык без строгой типизации и потому иногда могут возникать неожиданные результаты при сравнении (проверке) разных значений…

if( 0 == 'строка' ) echo 'Неужели?';
// Условие сработает и мы увидим: 'Неужели?' // другими словами — строка превращается в число при сравнении и становится 0:
var_dump( 0 == 'строка' ); //> bool(true) // но
var_dump( '0' == 'строка' ); //> bool(false)

Происходит так очевидно, потому что 'строка' превращается в ноль: intval( 'строка' ) = 0, а 0 == 0 это true, разумеется…

Так например можно пропустить переменную запроса:

// $_GET['foo'] может быть любой строкой и проверка всегда будет срабатывать…
if( $_GET['foo'] == 0 ){ echo $_GET['foo'];
} // поэтому по возможности ставьте проверку строго по типу
if( $_GET['foo'] === '0' ){ echo $_GET['foo'];
}

Все следующие значения одинаковы, при сравнении через == (не строгий оператор сравнения):

0 == false == «» == «0» == null == array()

Ну и так:

1 == '1нечто' == true
true == array(111) меню

in_array() нас обманывает

Вы мастер массивов в PHP. Вы уже знаете все о создании, редактировании и удалении массивов. Тем не менее, следующий пример может вас удивить.

Часто при работаете с массивами приходится в них что-либо искать с помощью in_array().

$array = array( false, true, 1 ); if( in_array( 'строка', $array ) ){ echo 'Неужто нашлось';
}

Обратите внимание

Как думаете выведет этот пример надпись «Неужто нашлось»? После такого вопроса, вы наверняка решили что условие сработает, но при написании кода, скорее всего было бы наоборот — и вы бы решили что условие не сработаетНа самом деле, это условие сработает и код выведет надпись «Неужто нашлось».

Так происходит, потому что PHP язык бестиповой и in_array() в данном случае сравнивает значения, но не учитывает тип, т.е. использует оператор ==, а не ===. А 'строка' == true даст нам true. Вот и получается что in_array() лжёт!

Решение

Чтобы избежать такого «обмана», нужно указать true в третий параметр в in_array(), так все сравнения будут проходить с учетом типа значения.

$array = array( false, true, 1 ); if( in_array( 'строка', $array, true ) ) echo 'Неужто нашлось';
else echo 'Не найдено'; // сработает этот вариант условия меню

Разница между PHP операторами OR и ||, AND и &&

PHP операторы OR, AND и ||, && соответственно, отличаются приоритетами выполнения. У последних он выше, поэтому они будут выполняться раньше.

Если сравнивать с оператором присваивания: =, то OR/AND будут выполняться ПОСЛЕ оператора присваивания, в то время как у || и && будут выполняться ДО оператора присваивания, из за более высокого приоритета. Рассмотрим эту разницу на примере:

OR и ||

$true = true; // присваиваем
$false = false; // присваиваем $var = $false OR $true;
// результат: $var = false
// потому что присваивание сработает раньше чем сравнение OR
// действует как: ( ($var = $false) or $true ) $var2 = $false || $true;
// результат: $var2 = true
// так как первым произошло сравнение, а уже потом присваивание var_dump( $var, $var2 ); // bool(false), bool(true)

AND и &&

// «&&» имеет больший приоритет, чем «and» $var = true && false;
// результат выражения (true && false) присваивается переменной $g
// работает как: ($var = (true && false)) $var2 = true and false;
// константа true присваивается $var2, а затем значение false игнорируется
// работает как: (($var2 = true) and false) var_dump( $var, $var2 ); //> bool(false), bool(true)

Полезная ссылка по этой теме: Приоритет оператора

меню

Шунтирующие операторы (короткая запись)

При сравнении типа AND &&, если первое условие вернет false/0/''/array(), то нет смысла проверять следующие условия, потому что всё условие выполнится только если сразу все вложенные условия вернут что-либо отличное от empty (не false)…

При сравнении типа OR ||, если хоть одно условие вернет true или что-то отличное от empty, то нет смысла проверять следующие вложенные условия, потому что все условие выполняется когда хоть одно под-условие возвращает не false.

// foo() никогда не буде вызвана
// так как эти операторы являются шунтирующими (short-circuit) $a = false && foo();
$b = ( false and foo() );
$c = true || foo();
$d = ( true or foo() ); меню

count() не всегда дает ожидаемый результат

var_dump( count(false) ); //> int(1)
var_dump( count(0) ); //> int(1)
var_dump( count('') ); //> int(1)
var_dump( count(array()) ); //> int(0) // тоже самое с sizeof()
var_dump( sizeof(false) ); //> int(1)
var_dump( sizeof(0) ); //> int(1)
var_dump( sizeof('') ); //> int(1)
var_dump( sizeof(array()) ); //> int(0)

isset() и null

Все мы привыкли проверять наличие значения в массиве через isset(). Однако если элемент в массиве есть, но его значение null, то isset() вернет false, как если бы элемента в массиве не было.

Наличие элемента со значением null можно проверить функцией array_key_exists().

$array = array('first' => null, 'second' => 4); isset( $array['first'] ); //> false array_key_exists( 'first', $array ); //> true

Странное поведение в PHP при передаче значения foreach по ссылке

$a = array( 'a', 'b', 'c' ); foreach( $a as & $v ){ }
foreach( $a as $v ){ } print_r( $a ); /*
Array
( [0] => a [1] => b [2] => b
)
*/

Мы дважды проводим итерацию по массиву, ничего не делая. Так что в результате никаких изменений не должно быть. Правильно? — Неправильно!

Чтобы не ловить такие баги, при передаче по ссылке значения в foreach, указывайте уникальное значение переменной $val или очищайте $val после foreach с помощью unset($val).

foreach( $a as & $v ){}
unset($v);

Почему так происходит отлично объясняется тут.

меню

empty() и объекты

Проверка empty() на объектах может вести себя странно. Допустим у нас есть некий объект $obj и мы проверяем пусто ли свойство var, и получаем такое:

if( empty( $obj->var ) ){ // условие сработает
} if( ! $obj->var ){ // условие не сработает
}

Парадокс! Как такое может быть? empty() говорит что свойство пустое, а ! говорит что в нем что-то есть. Как одно и тоже свойство может быть пустым и не пустым одновременно? Квантовая суперпозиция господа…

Однако если разобраться, то нет тут ничего удивительного и все логично!

Дело в том, что конструкция empty() обращается к встроенному методу объекта __isset(), а прямой запрос свойства ($obj->var) обратиться к __get().

Т.е. получается empty() и ! запрашивают разные методы, если свойство не установлено:

class FOO { function __get( $name ){ if( $name == 'bar' ) return true; } } $obj = new FOO; var_dump( empty($obj->bar) ); //> bool(true) — переменной нет var_dump( ! $obj->bar ); //> bool(false) — переменная есть

А теперь, зададим значение свойства bar в __isset() и empty() его получит:

class FOO { function __isset( $name ){ if( $name == 'bar' ) return true; } function __get( $name ){ if( $name == 'bar' ) return true; } } $obj = new FOO; var_dump( empty($obj->bar) ); //> bool(false) — переменная есть var_dump( ! $obj->bar ); //> bool(false) — переменная есть меню

Увеличитель числа ++

Имеет большое значение в каком положении использовать ++ (инкремент, увеличитель).

++$i — увеличивает $i на 1, сразу — при текущем вызове $i.
$i++ — увеличит $i на 1, при следующем вызове $i.

$i = 0; echo $i++; //> 0 — число увеличится при следующем вызове
echo $i; //> 1 — увеличилось
echo ++$i; //> 2 — число увеличивается сразу // сейчас $i = 2 // увеличивать можно внутри условий, индексов массивов — где угодно
if( $i++ == 2 ) echo $i; //> 3
$array[ ++$i ]; //> просим элемент массива с индексом 4 // однако нужно учитывать положение множителя — до или после переменной
// в обоих случаях проверяемое число будет разное… // сейчас $i = 4 $array = array( 5 => 'foo' );
$array[ $i++ ]; //> ошибка — индекса нет, потому что мы просим 4

— — уменьшитель (декремент) работает точно также…

Повторим еще раз:

ПримерНазваниеДействие
++$a инкремент до Увеличивает $a на 1, затем возвращает значение $a.
$a++ инкремент после Возвращает значение $a, затем увеличивает $a на 1.
—$a декремент до Уменьшает $a на 1, затем возвращает значение $a.
$a— декремент после Возвращает значение $a, затем уменьшает $a на 1.

меню

Увеличение строки ++

С числами все довольно просто, но что будет если инкрементить строки?

Что выведет данный код?

$a = 'fact_2';
echo ++$a; //> fact_3 $a = '2nd_fact';
echo ++$a; //> 2nd_facu $a = 'a_fact';
echo ++$a; //> a_facu $a = 'a_fact?';
echo ++$a; //> a_fact? $a = 'Привет';
echo ++$a; //> Привет

При инкременте строки, PHP увеличивает последний символ на символ следующий по алфавиту. И если в конце 2, то следующий символ будет 3. После t следует u. Однако эта операция не имеет никакого смысла в случае, когда строка заканчивается на не буквенно-численный символ.

Этот момент хорошо описан в официальной документации по операциям инкремента/декремента, однако многие не читали этот материал, потому что не ожидали встретить там ничего особенного.

меню

Неточности с плавающей точкой

Посчитайте эту арифметику и скажите результат:

echo intval( (0.1 + 0.7) * 10 );

Сколько получилось, 8? А у компьютера 7!

Так происходит, потому что компьютеры не умеют хорошо работать с неточными числами — это как выясняется большая и старая проблема, есть даже статья на эту тему: «Что каждый компьютерщик должен знать об операциях с плавающей точкой».

Что получается в итоге и где ошибка?

0.1 + 0.7 = 0.79999999999 0.79999999999 * 10 = 7.9999999999 intval( 7.9 ) = 7 а не 8. Когда значение приводится к int, PHP обрезает дробную часть.

Однако, если посчитать так, то увидим 0.8, а не 0.79999999999. Хотя этот результат является лишь округлением:

echo 0.1 + 0.7; //> 0.8

Какой вывод можно сделать из этого примера? Будьте очень осторожны, когда дело касается дробных чисел (чисел с плавающей точкой) и никогда им не доверяйте.

Для складываний и вычитаний флоат чисел в PHP есть спец. фукцнии: bcadd(), bcsub(). Например:

echo bcadd(0.1, 0.7, 1); // 0.8
echo intval( bcadd(0.1, 0.7, 1) * 10 ); // 8 меню

Все объекты в PHP передаются по ссылке

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

Для примера, давайте рассмотрим такой код, когда мы используем объект для удобства, который создается из массива:

$data = (object) array( 'my_val' => 'bar',
); $var = $data;
$var->my_val = 'new_bar'; $var2 = $data;
echo $var2->my_val; //> new_bar

Читайте также:  Что такое http. коды ответов http сервера

Мы создали казалось бы общие данные, который потом планируем использовать в разных переменных, меняя данные объекта где нужно, а где не нужно оставляя исходный вариант. В этом случае изменение данных будет менять их и в исходном варианте…

Важно

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

$data = array( 'my_val' => 'bar',
); $var = $data;
$var['my_val'] = 'new_bar'; $var2 = $data;
echo $var2['my_val']; //> bar

Поэтому чтобы первый вариант работал правильно, в переменную нужно передавать копию объекта, создаваемую с помощью clone:

$data = (object) array( 'foo' => 'bar',
); $var = clone $data;
$var->foo = 'new_bar'; $var2 = clone $data;
echo $var2->foo; //> bar меню

Сложение массивов

При сложении массивов элементы добавляемого массива не заменяют исходные, как это часто ожидается.

$arr1 = [ 'key1'=>'val_1', 'key2'=>'val_2' ];
$arr2 = [ 'key1'=>'val_3', 'key2'=>'val_4', 'key3'=>'val_5' ]; print_r( $arr1 + $arr2 );
/*
Array [key1] => val_1 [key2] => val_2 [key3] => val_5
*/$arr1 = [ 'val_1', 'val_2' ];
$arr2 = [ 'val_3', 'val_4', 'val_5' ]; print_r( $arr1 + $arr2 );
/*
Array [0] => val_1 [1] => val_2 [2] => val_5
*/

Использовал при написании:

Источник: https://wp-kama.ru/id_6579/13-neozhidannostej-v-php.html

phpm.ru | Побитовые операторы

Побитовые операторы позволяют считывать и устанавливать конкретные биты целых чисел.

Побитовые операторы

ПримерНазваниеРезультат
$a & $b И Устанавливаются только те биты, которые установлены и в $a, и в $b.
$a | $b Или Устанавливаются те биты, которые установлены в $a или в $b.
$a ^ $b Исключающее или Устанавливаются только те биты, которые установлены либо только в $a, либо только в $b, но не в обоих одновременно.
~ $a Отрицание Устанавливаются те биты, которые не установлены в $a, и наоборот.
$a > $b Сдвиг вправо Все биты переменной $a сдвигаются на $b позиций вправо (каждая позиция подразумевает «деление на 2»)

Побитовый сдвиг в PHP — это арифметическая операция. Биты, сдвинутые за границы числа, отбрасываются. Сдвиг влево дополняет число нулями справа, сдвигая в то же время знаковый бит числа влево, что означает что знак операнда не сохраняется. Сдвиг вправо сохраняет копию сдвинутого знакового бита слева, что означает что знак операнда сохраняется.

Используйте скобки для обеспечения необходимого приоритета операторов. Например, $a & $b == true сначала проверяет на равенство, а потом выполняет побитовое и; тогда как ($a & $b) == true сначала выполняет побитовое и, а потом выполняет проверку на равенство.

Если оба операдна для &, | и ^ строки, то операция будет производиться с кодами ASCII всех символов строки и в результате вернет строку. Во всех остальных случаях, оба операнда будут преобразованы к целому и результатом будет целое число.

Если операнд для ~ строка, то операция будет производиться с кодами ASCII всех символов строки и в результате вернет строку, в ином случае как операнд, так и результат, будут считаться целыми.

Оба операнда и результат выполнения всегда считаются за целое.

Опция настроек PHP error_reporting использует побитовые значения, обеспечивая
реальную демонстрацию удаления значений битов. Чтобы показать все ошибки, кроме
замечаний, инструкции в файле php.

ini предлагают использовать:
E_ALL & ~E_NOTICE<\p>

Начинаем со значения E_ALL:
00000000000000000111011111111111
Затем берем значение E_NOTICE…
00000000000000000000000000001000

и инвертируем его с помощью ~:
11111111111111111111111111110111
Наконец, используем побитовое И (&), чтобы установить только те биты,
которые установлены в единицу в обоих значениях:
00000000000000000111011111110111<\p>

Совет

Другой способ достичь этого — использовать ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR, ^),
чтобы получить только те биты, которые установлены в единицу
либо только в одном, либо только в другом значении:
E_ALL ^ E_NOTICE<\p>

Пример #1 Побитовыми операции И, ИЛИ и ИСКЛЮЧАЮЩЕЕ ИЛИ (AND, OR и XOR) над целыми числами

Источник: http://phpm.ru/php/language.operators.bitwise.html

Сложение двух чисел на HTML + PHP

В статье рассказывается как создать приложение сложения двух чисел на HTML + PHP.

Статья из цикла «Сложение двух чисел». Для меня минимальное освоение любой системы программирования начинается с возможности создания такой программы.

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

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

Демо

  • Приготовления
  • Создание болванки
  • Наполнение HTML
  • PHP код

Приготовления

Нам потребуется так или иначе сервер, на котором просчитываются php скрипты.

Можно установить локальный сервер (например, тут описано, как я делаю у себя, но это лишь одна из миллиона инструкций в интернете) через установку связки Apache + Php + MySQL + phpMyAdmin, можно воспользоваться уже готовыми сборками (Denver, Open Server, WampServer и др.). Можно использовать сервер на каком-нибудь виртуальном хостинге и так далее. В общем, вариантов много.

Далее предполагается, что у вас есть такой сервер, вы умеете запускать в браузере php скрипты (если не знаете, то или тут почитайте или в любом другом месте в учебниках по PHP).

Создание болванки

Создаем текстовой документ под именем index.php.

Закинем в него простую болванку HTML5 документа:

Программа сложения двух чисел

Если мы сохраним документ и откроем в браузере, то увидим пустое белое окно, так как ничего видимого в документе пока нет – это просто болванка с шапкой, где располагаются некоторые мета-тэги (по сути их тоже можно было выкинуть), и пустое тело.

Если же вы открыли в браузере и увидели тот, текст, который написан выше, то, значит, вы неправильно открываете в браузере php скрипт.

Наполнение HTML

Так как нам нужно приложение, которое будет складывать два числа, то нужно два поля ввода текстовой информации. Следовательно, их нужно будет размещать в некоторой форме. Поэтому в теле HTML документа разместим такую форму.

Каждое поле имеет своё имя name с названием переменной a и b. Также они имеют начальное наполнение.

Нам нужна кнопка для вычислений:

При клике на кнопку будет вызываться тот скрипт, который у нас прописан в форме в свойстве action.

Общий документ будет иметь вид:

Программа сложения двух чисел

Если мы сохраним документ и его откроем, то получим следующее:

PHP код

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

Мы указали в качестве обрабатывающего скрипта тот же самый файл, который и отправил информация index.php.

То есть наш скрипт должен уметь работать в двух режимах: когда мы просто открыли php скрипт index.php и никуда не нажимали на кнопки, и когда мы его открываем с некоторой отправленной ему информацией из браузера клиента, когда пользователь нажал на кнопку формы.

Как можно отследить эти состояния и понять, в каком режиме запустил пользователь скрипт index.php?

Всё просто. Если переменные a и b в глобальном массиве передаваемой информации есть и они не пустые, то значит, пользователь нажал на кнопку (или имитировал). Если же переменных нет или они пустые, то пользователь открывает php скрипт пустой, например, перейдя по ссылке.

Начнем это творить. Добавим в начало документ конструкцию того, что внутри нее будем писать не HTML код, а PHP код.

Внутри нее и будем писать наш код.

Считаем передаваемую информацию:

if (isset($_GET['a'])) $string_a=htmlentities($_GET['a']);if (isset($_GET['b'])) $string_b=htmlentities($_GET['b']);

Что мы тут делаем? Вначале функцией isset() мы проверяем, а есть ли в глобальных переменных GET наши переменные. Если же они есть, то считываем из глобального массива $_GET переменную.

При этом не просто считаем, а прогоним через функцию htmlentities(), которая экранирует всякие символы в строке. Зачем это нужно? А чтобы злобные пользователи не отправили зловредный код в php скрипт.

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

Обратите внимание

Итак, переменные мы считали. Теперь проверим, что же содержится в переменных $string_a и $string_b. Если они пустые, то, значит, пользователь, просто запустил скрипт, если же нет, то нажал на кнопку.

Будем хранить информацию о таком режиме в переменной $isEmpty. Вначале предположим, что будто человек нажал на кнопку.

Но если обе переменных пусты, то, значит, на кнопку пользователь не нажимал.

if ((empty($string_a))&&(empty($string_b))) $isEmpty=true;

Теперь мы знаем, в каком режиме запущен php скрипт. В случае, если переменные содержат информацию, то проводим вычисления, иначе же приравняем переменные к начальных значениям.

Сейчас код выглядит так:

if (isset($_GET['a'])) $string_a=htmlentities($_GET['a']);if (isset($_GET['b'])) $string_b=htmlentities($_GET['b']);if ((empty($string_a))&&(empty($string_b))) $isEmpty=true;Программа сложения двух чисел

Теперь мы можем использовать наши результаты. Вначале в полях ввода выведем значения переменных a и b. Если кнопка не нажималась, то они будут равны 1 и 1. Если нажимались, то будут равны считанных значениям.

Строчки

поменяем на строчки:

Источник: http://blog.harrix.org/article/3307

Школа программирования

2016-06-20

PHP, Операторы, Операции, Булева логика, Что выполняется первым

В этом уроке мы рассмотрим, что такое операции и операторы в программировании. Узнаем о арифметических, логических и других операциях. И, конечно же, напишем код!

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

Основные операции, предназначенные в РНР для выполнения математических действий, всем хорошо знакомы. Они аналогичны операциям из обычной арифметики:

Отдельно следует обратить внимание на операцию определения остатка от деления %. Точное его определение звучит так: остатком от деления называется неотрицательное число, которое в сумме с произведением неполного частного и делителя дает делимое. Примеры:

В операциях сложения и деления нужно помнить одну важную особенность, связанную с типами операндов. Если оба аргумента — целые числа, то результат также будет целым числом.

В то же время, если хотя бы один из операндов — число с плавающей точкой, то и результат будет величиной с плавающей точкой, даже если получается целое число. Пример: 0.5 + 1.5 = 2.0, а не 2.

То есть переменная, в ко- торую мы поместим результат операции 0.5 + 1.5, будет вещественным числом с плавающей точкой.

Для этих пяти операций также существуют сокращенные версии в случае, когда одним из операндов в правой части выражения выступает переменная, которой присваивается значение (переменная из левой части выражения).

Например, чтобы не писать $а = $а + $b, можно сокращенно записать $а += $b. А для того чтобы удвоить значение переменной $a, достаточно написать $a *= 2 (то же самое, что $a = $a * 2 ).

Для увеличения или уменьшения значения переменной на единицу есть еще две сокращенных операции: инкремента ( ++ ) и декремента ( — ). В отличие от рассмотренных выше, это унарные операции.

Важно

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

Напишите и выполните сценарий ниже:

В результате выполнения должны быть выведены два числа: 1 и 2

Как видите, расположение унарной операции относительно операнда может иметь значение. В первом случае переменная $a увеличивается на единицу уже после выполнения команды вывода echo.

Напротив, во втором случае сначала $a становится равной 2, а уже потом происходит вывод с помощью echo. Старайтесь избегать влияния этой особенности на логику выполнения своих сценариев, т. к.

такого рода нюансы могут быть неочевидны и малозаметны.

Логические операции

Еще одну группу операций для работы с числами представляют операции сравнения:

  1. меньше =;
  2. равно ==;
  3. не равно !=;
  4. идентично ===;
  5. не идентично !==.

Все они сравнивают два заданных значения и возвращают логическое булево значение true или false. Пример представлен ниже:

В случае, если значение $a верно, сценарий выведет единицу, иначе — не выведет ничего. Это связано с особенностью представления логических переменных в PHP.

Отдельно следует рассмотреть операции «идентично» ( === ) и «не идентично» ( !== ). Они аналогичны операциям «равно» ( == ) и «не равно» ( != ) с тем лишь дополнением, что при сравнении учитываются также типы операндов. Логику работы операторов продемонстрирует пример ниже:

Читайте также:  Обзор криптобиржи exmo.me

Операции над строками

Наиболее важной операцией над строками является операция их объединения (конкатенации, от англ. concatenate). В наших примерах она уже не раз встречалась, и мы будем пользоваться ею постоянно. Для конкатенации строк PHP использует символ точки (» . «). Пример приведен ниже:

По аналогии с арифметическими операциями есть сокращенная операция для конкатенации. Следующая запись:
$а .= $b; эквивалентна строке:

$a = $a . $b;

С помощью оператора «точка» можно конкатенировать несколько строк:

$d = $a . $b . «some text» . $c;

Язык PHP предоставляет богатый арсенал функций для работы со строками, но т. к. обсуждение функций у нас будет в следующем уроке, то дальнейшие средства обработки строк оставим на потом.

Логические операторы

Логические операторы проверяют булевы условия. Операндами в данном случае должны выступать переменные с булевым типом данных. Если же в выражении участвует переменная с другим типом (например, целочисленная), то произойдет автоматическое приведение типа этой переменной к булеву.

Обратите внимание: это не значит, что переменная изменит свое значение и тип. Это значит только то, что для вычисления результата выражения будет использоваться не непосредственное значение нашей переменной, а ее приведенное к булеву типу значение.

Существуют четыре главных булева оператора: И ( and или && ), ИЛИ ( or или || ), НЕ ( not или ! ) и исключающее ИЛИ ( хоr ). Давайте разберемся, как работает каждый из них.

В таблице ниже в колонках AND , OR , XOR представлены результаты выполнения соответствующих операторов для разных вариантов операндов.

 Операнд 1  Операнд 2  and  or  xor
 True  True  True  True  False
 True  False  False  True  True
 False  False  False  False  False

Если с операторами И и ИЛИ обычно не возникает сложностей в понимании, то работа оператора «исключающее ИЛИ» не так очевидна.

Запомните, оператор «ис- ключающее ИЛИ» будет возвращать истину тогда, когда один из операндов равен истине, а другой ложен.

В случае, когда оба операнда истинны, оператор XOR возвращает false (т. е. ложь), в отличие от обычного оператора OR (логическое ИЛИ).

Давайте немного попрактикуемся в использовании логических операторов. Напишите самостоятельно следующий код и постарайтесь определить значение каждой переменной, не просматривая правильный ответ, который приведен далее.

В данном случае получим следующие значения:

  • $c — false (один из операндов ложный);
  • $d — true (один из операндов истинный);
  • $e — false (противоположное значение к $a );
  • $f — true (один из операндов истинный, в то время как второй — ложный).

Приоритетность операторов

Когда операторы образуют последовательность, например:
$c = $a++ + 2

Источник: http://codrob.ru/lesson/9

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

В PHP доступны все основные математические операции. В качестве операндов можно использовать как целые, так и вещественные числа.

В таблице приведен список арифметических операторов:

ОператорЗнакОписание
Сложение + Сложение двух значений
Вычитание Вычитание одного значения из другого
Умножение * Перемножение двух значений
Деление / Деление одного значения на другое
Получение остатка от деления % Деление одного значения на другое и возвращение остатка (деление по модулю)
Инкремент ++ Сокращенная запись увеличения числа на единицу
Декремент Сокращенная запись уменьшения числа на единицу
Унарное отрицание Превращение положительного числа в отрицательное или отрицательного в положительное

Операторы вычитания, умножения, деления, деления по модулю и сложения

Операторы вычитания, умножения, деления, деления по модулю и сложения используется точно так же, как и в математике. Здесь стоит уделить внимание операторам деления и деления по модулю.

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

При делении по модулю операнды преобразуются в целые числа (c удалением дробной части) до начала операции. Результат операции остатка от деления % будет иметь тот же знак, что и делимое:

Унарное отрицание

Оператор унарного отрицания обозначается знаком '-', он изменяет значение своего единственного операнда на противоположное:

В данном случае круглые скобки не нужны, потому что унарное отрицание имеет наивысший приоритет, но они помогают организовать код таким образом, чтобы было понятно, что имеет место сложение чисел -5 и 4.

Инкремент

Оператор инкремента, обозначается знаком ++ и может быть расположен с любой стороны от операнда, с которым он работает. Он увеличивает это значение на единицу, точно также, как при прибавлении единицы к значению.

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

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

Префиксная форма инкремента

Префиксная форма — это когда оператор инкремента расположен перед операндом, такая форма записи означает то, что инкремент будет выполнен первым: он увеличивает значение операнда на единицу и только потом уже выполняется вся остальная часть инструкции:

Постфиксная форма инкремента

Постфиксная форма записывается немного по другому — инкремент располагается в этом случае после операнда. При постфиксной форме записи первое использование операнда возвращает его текущее значение, только после этого значение будет увеличено на единицу:

Декремент

Оператор декремента, обозначается знаком —, и в отличие от оператора инкремента, уменьшает, а не увеличивает, на единицу значение своего операнда. Декремент также допускает префиксную и постфиксную форму записи:

Источник: https://puzzleweb.ru/php/13_arithmetic.php

PHP: операторы

Каким правилам нас учили в школе, такие действуют и в языке программирования php. Приоритет выполнения операций следующий:

  • Действия в скобках
  • Умножение, деление
  • Сложение, вычетание

Если вы не знаете, какая из операций выполнится первой, то подстрахуйтесь: возьмите нужную операцию в скобки.

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

В отличие от привычны нам четырех арифметических действий, в PHP есть пятое: остаток от деления — знак процента. Он возвращает ту часть числа, которая нацело не разделилась на второе число.

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

Операторы присваивания

Оператор присваивания в PHP — это знак равенства (=). Данный оператор присваивает в переменную слева значение, которое находится справа.

Также в PHP существую очень удобные сокращения арифметических операций с операторами присваивания.

СокращениеРасшифровка
$a += $b $a = $a + $b
$a -= $b $a = $a — $b
$a *= $b $a = $a * $b
$a /= $b $a = $a / $b
$a %= $b $a = $a % $b

Операторы инкремента

Удобны тем, что позволяют записывать сокращенно очень часто выполняемые арифметические действия: увеличение, либо уменьшение на единицу числа.

СокращениеРасшифровка
$a++ увеличивает $a на единицу
$a— уменьшает $a на единицу

Строковые операторы

По аналогии с числами очень часто необходимо складывать (соединять) строки. Для этого используется оператор точка (.). Он также имеет сокращенную запись.

Логические операторы

Логические опреаторы созданы для того, чтобы управлять условиями (об этом мы с вами поговорим немного попозже). Результатом выполнения данных операторов является либо true, либо false. Но для справки всё же ознакомьтесь:

ПримерНазваниеРезультат
$a and $b И TRUE если и $a, и $b TRUE.
$a or $b Или TRUE если или $a, или $b TRUE.
$a xor $b Исключающее или TRUE если $a, или $b TRUE, но не оба.
! $a Отрицание TRUE если $a не TRUE.
$a && $b И TRUE если и $a, и $b TRUE.
$a || $b Или TRUE если или $a, или $b TRUE.

PHP: логические операторы и операторы сравнения ->

Источник: https://intop24.ru/article_18_lesson_4.php

Математические функции PHP

Стандартные функции PHP

В PHP определœено большое количество стандартных функций, которые по областям применения разбиты более чем на сто групп.

Основными группами стандартных функций являются:

· математические функции;

· функции для работы с массивами;

· функции для работы с символами и строками;

· функции для работы с регулярными выражениями;

· функции для работы с датой и временем;

· функции для работы с файлами.

При описании стандартных функций PHP используется следующий синтаксис:

возвращаемый-тип имя-функции (тип-1 параметр-1, тип-2 параметр-2, …)

где возвращаемый-тип – имя типа для значения, возвращаемого функцией, тип-1, тип-2 и т.д. – типы значений параметров функций, а параметр-1, параметр-2 и т.д. – имена параметров функций. Необязательные параметры заключаются в квадратные скобки. Переменное число параметров одно и того же типа в функции указывается с помощью конструкции имя-типа….

В случае если параметр или возвращаемое значение имеют определœенный тип, то указывается имя этого типа, к примеру, int или array.

В случае если тип параметра или возвращаемого значения должна быть произвольным, то в качестве типа указывается псевдотип mixed. В случае если функция не возвращает значения, в качестве типа возвращаемого значения указывается тип void.

Совет

В случае если функция не требует параметров, то вместо списка параметров в скобках указывается тип void или пустые скобки.

Математические функции PHP можно разделить на следующие категории:

· функции выполнения операций над числами;

· тригонометрические функции и обратные тригонометрические функции;

· гиперболические функции и обратные гиперболические функции;

· функции проверки числовых значений;

· функции перевода чисел из одной системы счисления в другую;

· функции генерации случайных чисел.

Функции выполнения операций над числами включают в себя следующие основные функции:

· number abs(mixed number) – определœение модуля (абсолютного значения) числа number;

· float ceil(float value) – определœение ближайшего большего целого для числа value;

· float exp(float arg) – определœение экспоненты числа arg;

· float floor(float value) – определœение ближайшего меньшего целого для числа value;

· float log10(float arg) – определœение десятичного логарифма числа arg;

· float log(float arg) – определœение натурального логарифма числа arg;

· mixed max(number arg1, number arg2[, number …]) или mixed max(array numbers) – определœение аргумента с максимальным значением или элемента массива с максимальным значением;

· mixed min(number arg1, number arg2[, number …]) или mixed min(array numbers) – определœение аргумента с минимальным значением или элемента массива с минимальным значением;

· number pow(number base, number exp) – получение степени exp числа base;

· float round(float val[, int precision]) – определяет округленное значение числа val с точностью precision;

· float sqrt (float arg) – определœение квадратного корня числа arg.

Пример 4.6.94. Вычисление степени числа:

В следующем фрагменте вводятся два числа – $x и $y, а затем вычисляется и выводится значение $x$y:

echo »
Enter x: «;

$x = (float)trim(fgets(STDIN));

echo »
Enter y: «;

$y = (float)trim(fgets(STDIN));

echo »
x^y=», pow($x, $y);

Вывод этого фрагмента может иметь следующий вид:

Тригонометрические функции и обратные тригонометрические функции в качестве аргумента используют значение float и возвращают значение float.

Тригонометрические функции — ϶ᴛᴏ следующие функции: cos (косинус), sin (синус) и tan (тангенс), а обратные тригонометрические функции — ϶ᴛᴏ acos (арккосинус), asin (арксинус) и atan (арктангенс).

Гиперболические функции и обратные гиперболические функции также в качестве аргумента используют значение float и возвращают значение float.

К гиперболическим функциям относятся cosh (гиперболический косинус), sinh (гиперболический синус) и tanh (гиперболический тангенс), а к обратным гиперболическим функциям – acosh (обратный гиперболический косинус), asinh (обратный гиперболический синус) и atanh (обратный гиперболический тангенс).

Функции проверки числовых значений определяют, соответствует ли аргумент типа float заданному типу и возвращают значение true, в случае если соответствует и false – если не соответствует. Так, функция is_finite проверяет, является ли число конечным, функция is_infinite – является ли число бесконечным, а функция is_nan – является ли аргумент не числом.

Читайте также:  Что такое cookies и как их почистить

К функциям перевода чисел из одной системы счисления в другую относятся:

· number bindec(string binary_string) – перевод двоичного числа, представленного в виде строки символов, в десятичное число;

· number hexdec(string hex_string) – перевод шестнадцатеричного числа, представленного в виде строки символов, в десятичное число;

· number octdec(string octal_string) – перевод восьмеричного числа, представленного в виде строки символов, в десятичное число;

· string decbin(int number) – возврат строки, содержащей двоичное представление аргумента;

· string dechex(int number) – возврат строки, содержащей шестнадцатеричное представление аргумента;

· string decoct(int number) – возврат строки, содержащей восьмеричное представление аргумента.

Пример 4.6.95. Вывод десятичного числа в различных системах счисления:

Обратите внимание

В следующем фрагменте программы вводится число – $x, а затем выводится его двоичное, восьмеричное и шестнадцатеричное представление:

echo »
Enter number x: «;

$x = (int)trim(fgets(STDIN));

echo »
x binary value: «, decbin($x);

echo »
x octal value: «, decoct($x);

echo »
x hex value: «, dechex($x);

Вывод этого фрагмента может иметь следующий вид:

Для генерации случайных чисел используются следующие функции:

· int getrandmax(void) – получение максимально допустимого случайного числа;

· void srand([int seed]) – установка начального значения генератора случайных чисел;

· int rand([int min, int max]) – генерация целого случайного числа, равномерно распределœенного в диапазоне от min до max (если значения min и max не заданы, генерируется случайное число в диапазоне от 0 до значения, полученного с помощью функции getrandmax()).

Пример 4.6.96. Генерация случайного числа:

В следующем фрагменте сценария генерируются и выводятся два случайных числа, равномерно распределœенные в диапазоне от 0 до 1, с точностью три знака после запятой:

// Установка начального значения

// генератора случайных чисел

srand(5);

// Получение первого случайного числа

// в диапазоне (0-1)

$rand1 = ((double)rand(1, 1000))/1000.0;

// Получение второго случайного числа

// в диапазоне (0-1)

$rand2 = ((double)rand(1, 1000))/1000.0;

// Вывод случайных чисел

print »
$rand1=$rand1 $rand2=$rand2″;

В результате выполнения фрагмента будет выведена следующая строка:

  • — Математические функции

    Знаки операций Dim a As Integer, b As Long, c As Byte Оператор описания переменных Dim d as integer, k as double Если в разделе объявлений модуля поместить оператор Option Explicit, то при попытке использования предварительно не объявленной переменной VBA будет сообщать об… [читать подробнее].

  • — Стандартные математические функции

    Операции преобразования типов Использование в выражениях операндов разных типов Оператор-выражение Операция присваивания Операция присваивания выполняет действия по занесению результатов выражения, стоящего справа от… [читать подробнее].

  • — Стандартные математические функции

    Операции преобразования типов Использование в выражениях операндов разных типов Оператор-выражение Операция присваивания Операция присваивания выполняет действия по занесению результатов выражения, стоящего справа от… [читать подробнее].

  • — Организация работы с БД сервера MySQL средствами PHP

    Характеристика СУБД MySQL Работа с базами данных в веб-приложениях Обработка данных, переданных из форм Проверка заполнения и соответствия типов: $name = $_POST['name']; if($name=='') { $er=»Вы не назвали свое имя
    «; } else { if(is_string($name)==false) { … [читать подробнее].

  • — Элементы и структура сценария PHP

    История и версии PHP Технология работы с PHP Технология PHP была создана в конце 1994 года как простая программа, написанная на языке Perl, Расмусом Ледорфом (Rasmus Lerdorf). Ранние версии использовались на его домашней странице для того, чтобы… [читать подробнее].

  • — Элементарные математические функции

    В языке C большое количество стандартных функций. Кроме того, программист обычно создает свои собственные функции. Все они используются как элементы выражений. Мы рассмотрим элементарные математические функции, которые часто будут нужны в вычислениях. Чтобы пользоваться… [читать подробнее].

  • — Элементарные математические функции

    В языке C большое количество стандартных функций. Кроме того, программист обычно создает свои собственные функции. Все они используются как элементы выражений. Мы рассмотрим элементарные математические функции, которые часто будут нужны в вычислениях. Чтобы пользоваться… [читать подробнее].

  • — Функции PHP для работы с регулярными выражениями

    В PHP определено несколько функций для работы с регулярными выражениями. Функция preg_match() имеет следующий синтаксис: int preg_match (string pattern, string subject [, array matches [, int flags]]) и предназначена для проверки того, совпадает ли заданная строка subject с заданным регулярным выражением pattern. В… [читать подробнее].

  • — Стандартные математические функции

    Стандартная библиотека языка Си В любой программе кроме операторов и операций используются средства библиотек, входящих в среду программирования. Часть библиотек стандартизована и поставляется с компилятором. Функции, входящие в библиотеку языка Си,… [читать подробнее].

  • — Стандартные математические функции

    Стандартная библиотека языка Си В любой программе кроме операторов и операций используются средства библиотек, входящих в среду программирования. Часть библиотек стандартизована и поставляется с компилятором. Функции, входящие в библиотеку языка Си,… [читать подробнее].

  • Источник: http://referatwork.ru/category/obrazovanie/view/228666_matematicheskie_funkcii_php

    Операторы PHP

    Здравствуйте уважаемые начинающие программисты. Продолжим изучение элементов, из которых состоит php.

    В этой статье мы узнаем, что такое операторы php. Вообще-то, с некоторыми из них мы знакомы чуть ли не с детства, только знаем их как знаки (+, -, =, !, ?).

    В php все они называются операторами, что вполне логично, так как они выполняют определённое действие, или операцию.

    Можно даже сказать, что все печатные знаки не являющиеся буквой или цифрой, в php являются операторами. Но и это ещё не всё, так как есть операторы состоящие из букв.

    Давайте начнём по порядку.

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

    Арифметические операторы применяются для выполнения действий с числами.

    +    — оператор сложения;
    —    — оператор вычитания;
    /    — оператор деления;
    *    — оператор умножения;
    %    — оператор получения остатка при делении;
    ++    — оператор увеличения на единицу (инкремент);
    — —    — оператор уменьшения на единицу (декремент)

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

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

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

    Количество знаков, выводимых для дробного числа, зависит от установленного значения в директиве precision, находящейся в файле php.ini. Обычно это 12 символов не считая точки.

    Оператор % обычно применяется для определения, делиться ли одно число на другое без остатка или нет.

    Действия с арифметическими операторами, за исключением инкремента и декремента, называются бинарными, так как в них участвуют два операнда (слагаемое + слагаемое, делимое / делитель, и т. п.)

    Действия инкремента и декремента называются унарными, так как в них участвует один операнд. Есть ещё условная операция, в которой участвуют три операнда.

    Операторы инкремента (++) и декремента (- -) применяются только к переменным.

    Тип переменной integer (целые числа)

    Тип переменной string (строка)

    Важно

    Буква «d» выводится вместо буквы «с» потому, что она следующая по алфавиту, а мы увеличили значение переменной на единицу.

    В примерах показаны действия с инкрементом, и точно так же можно выполнять действия с декрементом.

    Поразрядные операторы

    Поразрядные операторы предназначены для работы с двоичными данными. Если кто-то не представляет что это такое — объясню. Двоичные числа — это числа типа 1001000011100000111000.

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

    &    — поразрядное соединение И (and);
    ~    — поразрядное отрицание (not);
    |    — поразрядное объединение ИЛИ (or);
    ^    — поразрядное исключение ИЛИ (xor);
        — сдвиг вправо битового значения операнда;

    Встреча с этими операторами вполне вероятна, так как двоичные данные широко используются при разработке программ по компьютерной графике. Но для их изучения, если кому то потребуется, придётся пройти отдельный курс на другом ресурсе.

    Операторы сравнения

    Операторы сравнения относятся к логическим операторам, и применяются для сравнения переменных. Массивы и объекты с их помощью сравнивать нельзя.

    >     — оператор больше;
    =>     — оператор больше или равно;
    <     — оператор меньше;

    Вот так, сами по себе, операторы сравнения почти не применяются. Основное их предназначение — это работа в паре с оператором if.

    Условные операторы if, else, elseif

    Условные операторы называются так потому, что предназначены для проверки некоего условия, в зависимости от которого выполняется то, или иное действие.

    В качестве аргумента, оператор if принимает логическую переменную, или выражение. Если условие верно то выводится результат, если не верно — пустая строка.

    Если в программе нужно задать два действия, одно из которых будет выполняться при истинном значении, а другое при ложном, то вместе с оператором if, применяется оператор else

    В этом случае выведется «Осадки не предвидятся», а если в выражении сменить знак «Больше» на «Меньше», то выведется «Возможны осадки». Вот так условные операторы проверяют условие, и выводят согласно ему верный результат.

    Очень часто возникает необходимость задать более двух условий, и тогда, для их последовательной проверки, применяется оператор elseif.

    Эта программа выведет «Снег». Если бы ни одно из условий не подошло, то вывелось бы «Возможны осадки».

    Оператор if может содержать сколько угодно блоков elseif, и только один оператор else.

    Совет

    Допускается альтернативный вариант записи — без фигурных скобок. В таком случае строки операторов if, else, elseif, заканчиваются двоеточием, а вся конструкция — ключевым словом (оператором) endif.

    Логические операторы похожи на поразрядные операторы. Разница между ними в том, что первые оперируют логическими переменными, а вторые цифрами.

    Логические операторы используются в случаях, когда нужно объединить несколько условий, что позволят сократить число операторов if, что в свою очередь позволяет уменьшить вероятность ошибки в коде.

    &&     — соединительный союз И;
    and     — тоже И, но с меньшим приоритетом;
    ||     — разделительный союз ИЛИ;
    or     — тоже ИЛИ, но с меньшим приоритетом;
    xor     — исключающее один элемент ИЛИ;
    !     — отрицание;

    Меньший приоритет означает, что при наличии обеих операторов, первым выполняется тот, у которого больший приоритет.

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

    Оператор присваивания

    Оператор присваивания = присваивает левому операнду значение правого.

    Оператор точка отделяет целую часть числа от дробной, и объединяет несколько строк и число, в одну целую строку.

    Как и в математике, оператор круглые скобки задаёт приоритет действию, в них заключённому.

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

    Оператор фигурные скобки

    В php существует три способа, или даже стиля, размещения фигурных скобок.

    1. BSD стиль  — скобки выравниваются по левому краю.

    if($next)
    {
    echo «Здравствуйте уважаемые начинающие программисты»;
    }

    2. GNU стиль  — скобки выравниваются с отступом от левого края

    if($next)
      {
        echo «Здравствуйте уважаемые начинающие программисты»;
      }

    3. K&R стиль — скобка открывается в строке оператора

    if($next){
    echo «Здравствуйте уважаемые начинающие программисты»;
    }

    С самого начала нужно выбрать один из стилей и в дальнейшем, при написании скриптов, использовать только его. Причём, совершенно не важно, какой стиль Вы предпочтёте. Важно чтоб на протяжении программы он был единообразным.

    Пока думаю хватит. В принципе, не только знаки, но и функции, и другие элементы, могут являться операторами, так что перечислить их все очень затруднительно, да и не к чему.

    Обратите внимание

    Достаточно иметь представления об основных базовых. А остальные будем разбирать на практических примерах.

    Неужели не осталось вопросов? Спросить

    Перемена

    По аэропорту Шереметьево в слезах бродит ирландец. Один из служащих решил посочувствовать: — По родине скучаете? — Вовсе нет. Только что я потерял весь свой багаж — Как же это могло случиться?

    — Сам не пойму. Вроде как следует пробку затыкал

    Константы в PHP < < < В раздел > > > Функции PHP

    Источник: https://starper55plys.ru/php/operatoryi-php/

    Ссылка на основную публикацию