pitaval
Guest
Странности в работе с массивом
Доброе время суток всем доблестным программистам, пишущим на PHP!
Два дня назад, при написании кода для довольно-таки большого проекта я столкнулся
со странной проблемой, на решение которой у меня ушло два дня (с перерывами на
сон и принятие пищи). Был произведен дебаггинг, трассировка на бумаге и все все все,
что могло бы выявить ошибку в коде. Но ничего не помогло. В результате решение
появилось у меня совершенно случайно.
Суть проблемы заключается в том, что PHP начинает вести себя очень странно (проще
говоря, безобразно) при проверке элементов массива-коллекции, в котором есть индекс
ноль, с нулевым значением. Проверку я запустил в цикле foreach, проверял и switch'ем и if'ом.
В обоих случаях, при проверке значения нулевого индекса (со значением ноль) выражение
вычисляется в TRUE.
Вот простой пример. Реальный пример был гораздо сложнее и касался безопасности, т.к. про-
верялись поля на наличие флажка проверки (ISFILL).
$my_arr["a"]=array("ISFILL", 1, 2, 3);
$my_arr["b"]=array(0, 1, 2, 3);
foreach($my_arr as $k=>$v)
{
if($my_arr[$k][0]=="ISFILL"){ echo "Проверка требуется!"; }else{ echo "Проверка не требуется..."; }
}
Вот что идет на аутпуте:
Проверка требуется!
Проверка требуется!
Хотя, по логике вещей в первом случае у нас стоит флажок "ISFILL" и это поле надо проверить,
а во втором случае у нас нет флажка и вместо него значение ноль.
Если во втором поле ($my_arr["b"]) изменить значение нулевого элемента на 1, то все пойдет
как по маслу.
Второй вариант исправления ошибки, это заменить операцию "равно" (= =) на "идентично" (= = =)
Но тут тоже возникает вопрос о странном поведении PHP, ведь "ISFILL"- это строка, а 0- целое...
Самое ужасное во всей этой истории- мои ощущения, когда я смотрю на абсолютно правильный код
и не понимаю, почему он не работает.
Может кто-то знает в чем кроется причина таких странностей.
Версия интерпретатора 4.3.2.2. Система- WinXP, сервер- Apache
Доброе время суток всем доблестным программистам, пишущим на PHP!
Два дня назад, при написании кода для довольно-таки большого проекта я столкнулся
со странной проблемой, на решение которой у меня ушло два дня (с перерывами на
сон и принятие пищи). Был произведен дебаггинг, трассировка на бумаге и все все все,
что могло бы выявить ошибку в коде. Но ничего не помогло. В результате решение
появилось у меня совершенно случайно.
Суть проблемы заключается в том, что PHP начинает вести себя очень странно (проще
говоря, безобразно) при проверке элементов массива-коллекции, в котором есть индекс
ноль, с нулевым значением. Проверку я запустил в цикле foreach, проверял и switch'ем и if'ом.
В обоих случаях, при проверке значения нулевого индекса (со значением ноль) выражение
вычисляется в TRUE.
Вот простой пример. Реальный пример был гораздо сложнее и касался безопасности, т.к. про-
верялись поля на наличие флажка проверки (ISFILL).
$my_arr["a"]=array("ISFILL", 1, 2, 3);
$my_arr["b"]=array(0, 1, 2, 3);
foreach($my_arr as $k=>$v)
{
if($my_arr[$k][0]=="ISFILL"){ echo "Проверка требуется!"; }else{ echo "Проверка не требуется..."; }
}
Вот что идет на аутпуте:
Проверка требуется!
Проверка требуется!
Хотя, по логике вещей в первом случае у нас стоит флажок "ISFILL" и это поле надо проверить,
а во втором случае у нас нет флажка и вместо него значение ноль.
Если во втором поле ($my_arr["b"]) изменить значение нулевого элемента на 1, то все пойдет
как по маслу.
Второй вариант исправления ошибки, это заменить операцию "равно" (= =) на "идентично" (= = =)
Но тут тоже возникает вопрос о странном поведении PHP, ведь "ISFILL"- это строка, а 0- целое...
Самое ужасное во всей этой истории- мои ощущения, когда я смотрю на абсолютно правильный код
и не понимаю, почему он не работает.
Может кто-то знает в чем кроется причина таких странностей.
Версия интерпретатора 4.3.2.2. Система- WinXP, сервер- Apache