|
|
|
| Есть вот такой простой код:
$vars = array(0 => 'abc', 'one' => 'main', 'two' => 'default', 'three' => 'index', 1 => '4');
$a = array();
foreach ($vars as $name => $value) {
switch ($name) {
case 'one':
echo 'Имя элемента (должно быть только one): ' . $name . '<br />';
$a['one'] = $value;
unset($vars['one']);
break;
case 'two':
echo 'Имя элемента (должно быть только two): ' . $name . '<br />';
$a['two'] = $value;
unset($vars['two']);
break;
case 'three':
echo 'Имя элемента (должно быть только three): ' . $name . '<br />';
$a['three'] = $value;
unset($vars['three']);
break;
}
}
print_r($a);
print_r($vars);
|
Почему при значении $name равного 0 при переборе массива оператор switch выбирает case со значением равным 'one', по идее он его вообще должен пропускать. | |
|
|
|
|
|
|
|
для: levsha
(02.01.2011 в 23:24)
| | если убрать ненормативную лексику (в адрес разработчиков языка, не в Ваш), могу только посоветовать, как исправить положение.
Картина усугубляется тем, что просто написать $vars = array('0' => 'abc', ничего не даст. | |
|
|
|
|
|
|
|
для: Trianon
(02.01.2011 в 23:43)
| | Угу,
=> true - это реально "весело".
Автор, вот. Это так.. чтобы не удивляться.
Если конкретно:
> If you compare a number with a string or the comparison involves numerical strings, then each string is converted to a number and the comparison performed numerically. These rules also apply to the switch statement. | |
|
|
|
|
|
|
|
для: Trianon
(02.01.2011 в 23:43)
| | Спасибо большое | |
|
|
|
|
|
|
|
для: Trianon
(02.01.2011 в 23:43)
| | Я такого никогда не видел...
можно обойтись и без (string).. | |
|
|
|
|
|
|
|
для: Tonik992
(04.01.2011 в 01:28)
| | Ну, так покажите, как. | |
|
|
|
|
|
|
|
для: neadekvat
(04.01.2011 в 01:29)
| | http://php.net/manual/en/control-structures.switch.php
тут | |
|
|
|
|
|
|
|
для: Tonik992
(04.01.2011 в 01:51)
| | Конкретно под эту ситацию покажите свой код.
[поправлено модератором] | |
|
|
|
|
|
|
|
для: neadekvat
(04.01.2011 в 01:54)
| | Trianon указывает на оскорбление разработчиков языка . Я ничего подобного не вижу. Можно хоть что передать в параметр switch(). Да хоть объект. А тот, кто составляет код, должен быть сам внимательней в таких случаях.
Ну то, что тут switch((string)$name) помог - не сомневаюсь | |
|
|
|
|
|
|
|
для: Tonik992
(04.01.2011 в 02:06)
| | Вообще-то, Trianon говорил о том, что разработчики языка заслуживают пару ласковых в свой адрес за то, что при сравнении с числом у них строка превращается в 0, и ('avc' == 0) дает true. | |
|
|
|
|
|
|
|
для: neadekvat
(04.01.2011 в 02:11)
| | Ну да, заслуживают. Только Trianon об этом не говорил... | |
|
|
|
|
|
|
|
для: Tonik992
(04.01.2011 в 02:06)
| | > Trianon указывает на оскорбление разработчиков языка . Я ничего подобного не вижу.
Ну в общем-то да. Если создание разработчиками языка такого механизма, который нарушает мало мальски очевидные программисту принципы и подходы пользователя этого языка, расценивать как оскорбление пользователя, то да - указываю на оскорбление.
> Можно хоть что передать в параметр switch(). Да хоть объект. А тот, кто составляет код, должен быть сам внимательней в таких случаях.
Я очень внимательно проанализировал код, затем прогнал его через php в нескольких вариациях.
levsha аккуратно передает в switch скаляр. Скаляр, не массив, не объект. И в качестве меток сравнения case val: у него выступают скаляры, более того скаляры-константы. Куда уж проще задача - сравнить скалярную переменную с набором констант и сделать соответствующий выбор?
>Ну то, что тут switch((string)$name) помог - не сомневаюсь
ну так а без switch((string)$name) - как написать?
При условии, что определение $name Вам не принадлежит, а задано где-то извне?
между прочим, при глубоком рассмотрении мы наткнемся на еще одну неортогональность, которая вкупе с первой (сравнение int со string) и породила такой взрывоопасный коктейль:
в определении
$vars = array('0' => 'abc', 'one' => 'main', 'two' => 'default', 'three' => 'index', '1' => '4');
интерпретатор чихать хотел на апострофы вокруг нуля.
Он все равно сделает ключ числовым.
На каком основании он отказывает в праве символу 0 являться текстом в пользовательском контексте, непонятно совершенно. | |
|
|
|