Имеется XML документ, из него идет парсинг значений полей и далее необходимо узнать тип значения записанный в строковой переменной. Для определения типа значения в переменной написал такую функцию.
public function getTypeValue($var) {
if (is_numeric($var)) {
if (is_int($var)) {
return 'int';
}elseif (is_integer($var)){
return 'integer';
}elseif (is_long($var)){
return 'long';
}elseif (is_float($var)){
return 'float';
}elseif (is_double($var)){
return 'double';
}else{
return "len: " . strlen($var);
}
}else{
return 'string';
}
}
Как ни крути, там где строки, выдает string, там где числа (014982, 2, 3, 3.1.3 и т.п.) функция выдает информацию по длинне строки но не тип. Блок else для чисел сделал для проверки нет ли посторонних символов в строке, которые бы мешали. По результатам видно что ничего постороннего там нету.
Если взять обычный массив и заполнить данными то функция отрабатывает верно, то есть определяет и строки и числа разного типа. Как побороть ситуацию?
Код обработки XML:
public function parse() {
$fullpath = PATH_XMLFOLDER . "/linecheck.xml";
$xml = simplexml_load_file($fullpath);
$fields = $xml->xpath('//fields/*');
foreach ($fields as $field) {
$fieldName = (string)$field->getName();
$value = (string)$field;
$typeValue = $this->getTypeValue($value);
SVTools::sv_debug($value,0);
SVTools::sv_debug($typeValue,0);
}
}
После
if (is_numeric($var)) {
поставьте
$var = 0 + $var;
P.S. is_int() === is_integer() === is_long() и is_float() === is_double()
XML сам по себе не имеет поддержки описания типов данных. Поэтому все скалярные значения будут строками. Всегда.
Приводить к какому-то типу данных и его валидировать соответственно этому вы должны уже основываясь на знаниях, что именно вы хотите найти в этом документе.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники