Php intval


Иногда встречаю в одном программном коде разные способы приведения типов. А именно: (int) и IntVal(). Что же лучше использовать? Один из главных моих критериев работы программного кода — это быстродействие. От него и будет зависеть выбор функций. Поэтому оценим что же выполняется быстрее: (int) или IntVal().

Сначала зададим то, что будем приводить:

$a = ‘ 1 ‘;

Встречайте! Это единица, записанная как текст. С пробелом до неё и после неё. После приведения типов она должна стать настоящим числом.

Поставим приведение типов в цикл:

$time_start = microtime(true);

(int)$a;

$time_end = microtime(true);

Разница между этими временными метками будет соответствовать времени выполнения (int)$a. Чтобы результат не был случайным, поставим этот код в цикл. К примеру, 1 000 000 повторений даст более-менее среднюю величину времени приведения типа. То же самое сделаем с IntVal($a)

$time_start = microtime(true);

IntVal($a);

$time_end = microtime(true);


Поделим среднее время выполнения IntVal($a) на (int)$a. И получаем, что (int)$a примерно в 1.05-1.5* раза быстрее, чем IntVal($a).

* Простите меня грешного! С расчётом среднеквадратичного отклонения не заморачивался. Считал только среднее.

Чистота эксперимента

Проверку делаю на сервере с установленным Apache, PHP как модуль (v. 7.0.14) и BitrixEnv (v. 7.0.0). Битрикс окружение идёт со средствами ускорения PHP (OpCache, APCu). Поэтому результат можно назвать нечистым. Но применимым к серверам на BitrixEnv.

Ещё меня удивило то, что каждый 10-20 цикл IntVal() проигрывала (int) по скорости не просто 5 — 50 %, а все 5 000 %. Наверное, ускорители тянут за уши IntVal(), чтобы она быстрее работала, но обновляют состояние каждый 10-20 циклов. Отсюда такое сильное выпадение некоторых результатов.

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

Вывод

(int) до 50% быстрее, чем IntVal().

IntVal() стоит использовать только ради второго параметра. Который хз что делает и никто им не пользуется ?

www.alexgur.ru

Смысл функции intval()


Функция intval() PHP служит для преобразования «переменной в целое», имеет два параметра и двойной смысл.

Php intval

Вторым параметром является основание требуемой системы счисления. По умолчанию используется десятичная система. Если не указывать второй параметр, то число, которое начинается с символа «0» считается восьмеричным, а с символов «0х» — шестнадцатеричным.

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

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

Php intval

Логика функции intval PHP — преобразовать строку или число в целое для практического применения. Например, сформировать правило CSS, в котором применяются только целые числа. Преобразовать вещественное число в целое простым изъятием только целой части.

Применение функции intval()

Функция intval() в PHP не единственная для целей получения целого. Можно использовать round(), ceil() и floor(). Эти функции оперируют общепринятой логикой округления.

Функция intval() PHP лишена какой-либо логики и действует по принципу получить целое число. Если требуется, то по нужному основанию нужной системы счисления.

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


Php intval

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

Источник

ruud.ru

<?php
echo intval(42);                      // 42
echo intval(4.2).


;// 42
echo intval('+42');                   // 42
echo intval('-42');                   // -42
echo intval(042);&nbs.

span style="color: #FF8000">// 42
echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1
echo intval(0x1A); .

000">// 42000000
echo intval(420000000000000000000);   // 0
echo intval('420000000000000000000'); // 2147483647
echo intval(428);                   <.

style="color: #007700">echo 
intval(array());                 // 0
echo intval(array('foo''bar'));     // 1
?>

php.segmenta.ru

PHP действительно «подключен» с так называемым манипулятором типа.


x42D;то наиболее подверженная ошибкам часть большинства PHP-скриптов. Таким образом, вы всегда должны оставаться на безопасной стороне и использовать самую надежную проверку. Например, intval("twelve") вернет 0, что является действительным целым числом. Но также считается «ложным»: print if (intval("one")) ? "yup" : "nope"

print if (intval("one")) ? "yup" : "nope" напечатает «nope».

В этом случае использование intval в сочетании с проверкой, если целое число больше нуля, должно сделать трюк:

 <?php $id = intval($_GET['id']); if($id > 0){ // The column which I should look into is id $column = 'id'; }else{ // The column which I should look into is page_name $column = 'page_name'; } $query = mysql_qyery(SELECT * FROM members WHERE $column = '$id'); ?>  

Или, короче:

 $id = intval($_GET['id']); $column = ($id > 0) ? "id" : "page_name"; $query = mysql_qyery(SELECT * FROM members WHERE $column = '$id'); 

Aso обратите внимание, что $ _GET ["id"] не может быть установлен, что вызовет уведомление в вашем коде.

И последнее, но, конечно, не в последнюю очередь: SQL-инъекция ?id=LittleBobby';Drop table users

Как замечает комментатор, в моем коде есть логический недостаток, связанный с тем, что я тестировал его только в phpsh . Я реорганизовал его с использованием is_int() для intval и > 0 . В веб-среде $ _GET ["id"] всегда является строкой; не важно что. Следовательно is_int() всегда возвращает FALSE .

ruphp.com

<?php
echo intval(42);                      // 42
echo intval(4.2);                     // 4
echo intval('42');                    // 42
echo intval('+42');                   // 42
echo intval('-42');                   // -42
echo intval(042);                     // 34
echo intval('042');                   // 42
echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1
echo intval(0x1A);                    // 26
echo intval(42000000);                // 42000000
echo intval(420000000000000000000);   // 0
echo intval('420000000000000000000'); // 2147483647
echo intval(428);                   // 42
echo intval('42'8);                 // 34
echo intval(array());                 // 0
echo intval(array('foo''bar'));     // 1
?>

php.net

When you need to work with integer values that exceed maxint, the following functions may be of use to you - they form a codec pair for integers of variable length rather than fixed length, encoded in a byte as a 7 bit numberal with a 1 bit has-more flag, indicating that the next byte encodes a higher order part of the same number still.
<?php
/* encode integer as 7bit with has-more bit numeral,
   ordered lowest byte first. */
function encode_7bhm($int) {
 if ($int==0) return chr(0); // shortcut
 $ret = "";
 while($int != 0) {
   $high = floor($int / 128);     // overflow for this round
   $low = $int - ($high * 128); // 7 bit numeral
   if ($int > 0) {
     if ($high > 0) { $low = $low + 128; } // has-more flag
     $ret .= chr($low); } //encode
   $int = $high;  // set overflow as next round's number
 }
 return $ret;
}
/* decode a 7bit with has-more bit numeral,
   ordered lowest byte first. */
function decode_7bhm($hmb) {
 $ret = 0;
 $pos = 0;
 $high = 1;
 while($high == 1) {
   $byte = ord(substr($hmb, $pos, 1));
   $high = floor($byte/128); // gets has-more flag
   $low = $byte - ($high*128);
   $ret += $low * pow(128, $pos++); // decode
 }
 return $ret;
}
?>
This codec pair is also quite useful when needing to write ints to files, as this is a low-numeral biased encoding: most of the time this will only require 8 or 16 bit rather than the 32 bits an int will use in fixed-length encoding.
The encoding range:
 1 byte  - 0 through 128 (2^7)
 2 bytes - 129 through 16,384 (2^14)
 3 bytes - 16,385 through 2,097,152 (2^21)
 4 bytes - 2,097,153 through 268,435,456 (2^28)
while indeed a 32 bit encoded variable length integer will be lower than maxint, rather than needing a new 32 bit block to represent higher range only 8 more bits are required to represent this higher number (for completeness the range of representation by bytes 5-8 are listed):
 5 bytes - 268,435,457 through 34,359,738,368 (2^35)
 6 bytes - 343,59,738,369 through 4,398,046,511,104 (2^42)
 7 bytes - 4,398,046,511,105 through 562,949,953,421,312 (2^49)
 8 bytes - 562,949,953,421,313 through 720,57,594,037,927,936 (2^56)
Also for completeness, the function to read a 7 bit with has-more bit from a filepointer:
<?php
// read a 7bhm numeral from file
function read_7bhm($fp) {
 $bytestring = "";
 $high = 1;
 while($high==1) {
   $byte = fread($fp, 1);
   $high = floor(ord($byte)/128); // check for has-more bit
   $bytestring .= $byte;
 }
 return decode_7bhm($bytestring); }
?>

www.navioo.com

<?php
echo intval(42);                      // 42
echo intval(4.2);                     // 4
echo intval('42');                    // 42
echo intval('+42');                   // 42
echo intval('-42');                   // -42
echo intval(042);                     // 34
echo intval('042');                   // 42
echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1
echo intval(0x1A);                    // 26
echo intval(42000000);                // 42000000
echo intval(420000000000000000000);   // 0
echo intval('420000000000000000000'); // 2147483647
echo intval(428);                   // 42
echo intval('42'8);                 // 34
echo intval(array());                 // 0
echo intval(array('foo''bar'));     // 1
?>

php.ru

<?php
echo intval(42);                      // 42
echo intval(4.2);                     // 4
echo intval('42');                    // 42
echo intval('+42');                   // 42
echo intval('-42');                   // -42
echo intval(042);                     // 34
echo intval('042');                   // 42
echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1
echo intval(0x1A);                    // 26
echo intval(42000000);                // 42000000
echo intval(420000000000000000000);   // 0
echo intval('420000000000000000000'); // 2147483647
echo intval(428);                   // 42
echo intval('42'8);                 // 34
echo intval(array());                 // 0
echo intval(array('foo''bar'));     // 1
?>

phpm.ru


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.