Php строку в число


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

Что будет в случаях?

$a = 'строка';  $b = 0;  if ( $a == $b ) var_dump('равно');  else var_dump('не равно');  

и

$a='125строка';  $b=125;  if ($a==$b) var_dump('равно');  else var_dump('не равно');  

Кажется, что в первом и втором случаях будет «не равно» ?
А вот и нет ? .

В двух случаях выражения будут «равно».

В PHP происходит автоматическое приведение типа.
Т.е. при сравнении с числом выражение вида «строка» приводится к 0,
а выражение вида «125строка» — к 125

————————————————————-

У меня возникла следующая ситуация.

Есть адрес вида www.ato.by/?value=ххх , где ххх — это число.
Мне потребовалось, в случае если ввели «/?value=хххстрока»,
делать автоматический 301 редирект на адрес «/?value=ххх»

В начале сделал так:

if ($_GET['value'] != intval($_GET['value'])) {  	$URL= "http://site.ru/?value=" . intval($_GET['value'])  	header ("Location: $URL");  }  

— не работает по указанной выше причине.

Для избежания данной ситуаций требуется использовать конструкции:


  • 1) функцию is_numeric
  • 2) (string)$id == (string)(int)($id)
  • 3) === — т.е. проверять совпадение типа и значения

Т.е. в моем случае следовало использовать:

if ( !is_numeric($_GET['value']) ) {  	$URL= "http://site.ru/?value=" . intval($_GET['value'])  	header ("Location: $URL");  }  

или

if ( (string)$_GET['value'] != (string)(int)($_GET['value']) ) {  	$URL= "http://site.ru/?value=" . intval($_GET['value'])  	header ("Location: $URL");  }  

itif.ru

Приведение к целому числу

При приведении bool в integer, FALSE преобразуется в 0 (нуль), а TRUE — в 1 (единицу). При приведении float в integer, дробная часть будет округлена в сторону нуля. Значение NULL преобразуется в 0:

  echo (int)FALSE, "<br>"; // 0  echo (int)TRUE, "<br>"; // 1  echo (int)12.3, "<br>"; // 12  echo (int)NULL; // 0  

Строки преобразуются по следующим правилам:


  • Если первый символ строки является цифрой, знаком + или -, то интерпретатор переходит к анализу второго символа, если второй символ строки является цифрой, то интерпретатор переходит к анализу третьего символа и так до тех пор, пока не будет обнаружен символ отличный от цифры, после этого интерпретатор возвращает полученное целое число.
  • Если строка пустая или первый символ строки не является цифрой, знаком + или -, она преобразуется в 0.
  echo (int)"12abc", "<br>"; // 12  echo (int)"a123bc", "<br>"; // 0  echo (int)"-12", "<br>"; // -12  echo (int)"12.3", "<br>"; // 12  echo (int)""; // 0  

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

Приведение к числу с плавающей точкой

Строки преобразуются по следующим правилам:

  • Если первый символ строки является цифрой, точкой, знаком + или -, то интерпретатор переходит к анализу второго символа, если второй символ строки является цифрой, точкой (если перед этим была цифра), буквой e или E (если перед этим была цифра или точка), то интерпретатор переходит к анализу третьего символа и так до тех пор, пока не будет обнаружен символ, который не может быть преобразован в числовое значение, после этого интерпретатор возвращает полученное число с плавающей точкой.
  • Если строка пустая или первый символ строки не является цифрой, точкой, знаком + или -, она преобразуется в 0.

  echo (float)"12abc", "<br>"; // 12  echo (float)"a123bc", "<br>"; // 0  echo (float)"-12", "<br>"; // -12  echo (float)"12.3", "<br>"; // 12.3  echo (float)".13", "<br>"; // 0.13  echo (float)"1.2e5", "<br>"; // 120000  echo (float)"1.e5"; // 100000  

Значения других типов сначала преобразуются в integer, а затем уже из integer происходит преобразование в тип float.

Приведение к булеву типу

Следующие значения в результате преобразования дают значение FALSE:

  • само значение FALSE
  • 0 и 0.0 (нуль)
  • пустая строка, и строка «0»
  • массив без элементов
  • NULL
  • Объекты SimpleXML, созданные из пустых тегов

Все остальные значения при преобразовании дают в результате значение TRUE. Значение FALSE и шесть значений, которые при преобразовании приводятся к этому значению, обычно называют ложными значениями, а все остальные — истинными:

  echo (bool)"", ": FALSE", "<br>"; // FALSE  echo (bool)1, ": TRUE", "<br>"; // TRUE  echo (boolean)[], ": FALSE"; // FALSE  

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


, а истинные значения — как TRUE.

Приведение к строке

Булево значение TRUE преобразуется в строку «1», а значение FALSE преобразуется в "" (пустую строку):

  echo (string)TRUE;  echo (string)FALSE, "<br>: пустая строка";  

Целое число или число с плавающей точкой преобразуется в строку, состоящую из цифр числа:

  echo (string)-123, "<br>";  echo (string)12.4, "<br>";  echo (string)1.4e6; // "1400000"  

Массивы всегда преобразуются в строку "Array":

  $arr = [];  echo (string)$arr;  

NULL всегда преобразуется в пустую строку:

  echo (string)NULL, "пустая строка";  

Resource всегда преобразуется в строку вида "Resource id #1".

Для преобразования объекта в строку, объект должен иметь метод __toString():

  class Obj {   public function __toString() {   return "Object";   }  }    $obj = new Obj;  echo (string)$obj;  

Если объект не имеет метод __toString()


, то в результате преобразования будет вызвана фатальная ошибка:

  class Obj {}    $obj = new Obj;  echo (string)$obj; // Будет вызвана ошибка  

Приведение к NULL

Приведение к типу NULL не удаляет переменную и её значение, а лишь возвращает значение типа NULL:

  $num = 10;  echo gettype((unset)$num), "<br>";  echo $num;  

puzzleweb.ru

Строки и числа

Строки — это, прежде всего, совокупности различных символов. В разных средствах программирования дробная часть отделялась от целой по-разному. Одни предпочитали точку, другие запятую (в PHP преобразование строки в число подразумевает «.»). Триады разделялись одинарным апострофом, запятой или пробелом. Вещественные числа записывались через букву «Е».

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

PHP преобразование строки в число

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

Общее правило преобразования


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

Любой нецифровой символ в последовательности цифр останавливает процесс, и результат преобразования PHP «строка в число» будет только тем значением, которое сформировалось до первого нецифрового символа.

Математика и обработка символов

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


PHP преобразовать строку в число

Обычно на PHP строка в число преобразуется автоматически, но никогда не будет лишним проверить это. Лучше всего всегда быть уверенным: PHP правильно понимает, что та или иная переменная — это число. Если есть хоть тень сомнения, следует явно указать тип переменной (int) или (float) перед значением и проверить, как PHP понимает тип переменной функциями is_integer() или is_float().

Тенденции современного программирования

Классическая интерпретация задачи на PHP «строка в число» лежит в пределах представлений современного программирования. Обратный процесс имеет значительно более разнообразные варианты. Функциями number_format(), printf(), sprintf() можно творить чудеса, причем не только на уровне одного числа, но и группы чисел.

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

И это можем, но это не наше!

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


fb.ru

Вот что я написал для упрощения вещей для себя:

Он также возвращает сокращенные версии логических, целых, двойных и реальных.

 function type($mixed, $parseNumeric = false) { if ($parseNumeric && is_numeric($mixed)) { //Set type to relevant numeric format $mixed += 0; } $t = gettype($mixed); switch($t) { case 'boolean': return 'bool'; //shorthand case 'integer': return 'int'; //shorthand case 'double': case 'real': return 'float'; //equivalent for all intents and purposes default: return $t; } }  

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

Таким образом:

type ("5", true) вернет int

type ("3.7", true) вернет float

type ("500") вернет строку

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


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

редактировать

Если вы хотите определить, являются ли объекты функциями, добавьте этот случай к коммутатору:

 case 'object': return is_callable($mixed)?'function':'object'; 

ruphp.com

Строки и числа

Строки — это, прежде всего, совокупности различных символов. В разных средствах программирования дробная часть отделялась от целой по-разному. Одни предпочитали точку, другие запятую (в PHP преобразование строки в число подразумевает «.»). Триады разделялись одинарным апострофом, запятой или пробелом. Вещественные числа записывались через букву «Е».

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

PHP преобразование строки в число

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

Общее правило преобразования

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

Любой нецифровой символ в последовательности цифр останавливает процесс, и результат преобразования PHP «строка в число» будет только тем значением, которое сформировалось до первого нецифрового символа.

Математика и обработка символов

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

PHP преобразовать строку в число

Обычно на PHP строка в число преобразуется автоматически, но никогда не будет лишним проверить это. Лучше всего всегда быть уверенным: PHP правильно понимает, что та или иная переменная — это число. Если есть хоть тень сомнения, следует явно указать тип переменной (int) или (float) перед значением и проверить, как PHP понимает тип переменной функциями is_integer() или is_float().

monateka.com

The object casting methods presented here do not take into account the class hierarchy of the class you're trying to cast your object into.

/**
     * Convert an object to a specific class.
     * @param object $object
     * @param string $class_name The class to cast the object to
     * @return object
     */
    public static function cast($object, $class_name) {
        if($object === false) return false;
        if(class_exists($class_name)) {
            $ser_object     = serialize($object);
            $obj_name_len     = strlen(get_class($object));
            $start             = $obj_name_len + strlen($obj_name_len) + 6;
            $new_object      = 'O:' . strlen($class_name) . ':"' . $class_name . '":';
            $new_object     .= substr($ser_object, $start);
            $new_object     = unserialize($new_object);
            /**
             * The new object is of the correct type but
             * is not fully initialized throughout its graph.
             * To get the full object graph (including parent
             * class data, we need to create a new instance of
             * the specified class and then assign the new
             * properties to it.
             */
            $graph = new $class_name;
            foreach($new_object as $prop => $val) {
                $graph->$prop = $val;
            }
            return $graph;
        } else {
            throw new CoreException(false, "could not find class $class_name for casting in DB::cast");
            return false;
        }
    }

php.net


You May Also Like

About the Author: admind

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

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

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