|
|
|
| Задача такова.
В котором могут быть значения 1,2,3. Причем может быть только одно значение, например 1 или 3, а могут быть и все значения 1,2,3
Приоретететным считается 1, затем если такого значения нет, то 2, и только потом 3. В зависимости от приоретета должно выполняться разные условия.
Правильно ли в данном примере решена задача?
<?php
$array = array(1,2,3);
$block = "";
switch($array)
{
case in_array(1,$array):
$block = "first_block.php";
break;
case in_array(2,$array):
$block = "second_block.php";
break;
case in_array(3,$array):
$block = "third_block.php";;
break;
default:
$block = "rand_block.php";
break;
}
include $block;
?>
|
| |
|
|
|
|
|
|
|
для: admiral
(18.12.2009 в 23:07)
| | Оператор Switch не занимается оценкой условий.
Оператор Switch выполняет сопоставление значения скалярного выражения с рядом констант.
Всё. | |
|
|
|
|
|
|
|
для: Trianon
(18.12.2009 в 23:27)
| | Как раз-таки не все. Он выполняет сопоставление до тех пор, пока не найдено первое соответствие, и если оно найдено, то на дальнейший ряд констант он забивает.
Следовательно, задача была найти соответствие по приоритетному значению. Вот я и спросил для этих целей switch самое оптимальное решение? | |
|
|
|
|
|
|
|
для: admiral
(18.12.2009 в 23:48)
| | Вы оптимальное решение ищете?
Нашли бы сперва просто работающее.
То что у Вас написано, на работающее как-то не смахивает.
UPD.
Сопоставление выполняется со всеми параллельно и одновременно. Если канонически. | |
|
|
|
|
|
|
|
для: Trianon
(18.12.2009 в 23:56)
| | оно работает, поскольку true равно (==) непустому массиву. "Ошибка" будет правда при пустом массиве.
[поправлено модератором] | |
|
|
|
|
|
|
|
для: Fractured#
(18.12.2009 в 23:59)
| | Пустого массива как я в условии сказал быть не может вообще. | |
|
|
|
|
|
|
|
для: Fractured#
(18.12.2009 в 23:59)
| | Кстати что имеется ввиду за ошибка при пустом массиве? Тоесть по идее даже если массив будет пустым сработает секция default | |
|
|
|
|
|
|
|
для: Fractured#
(18.12.2009 в 23:59)
| | Хотя да действительно, Вы правы | |
|
|
|
|
|
|
|
для: admiral
(19.12.2009 в 00:26)
| | А канонически Ваша задача решается так:
<?php
$array = array(1,2,3);
if(in_array(1,$array)) $block = "first_block.php";
elseif(in_array(2,$array)) $block = "second_block.php";
elseif(in_array(3,$array)) $block = "third_block.php";
else $block = "rand_block.php";
include $block;
?>
|
| |
|
|
|
|
|
|
|
для: Trianon
(18.12.2009 в 23:56)
| | >Вы оптимальное решение ищете?
Ага.
>Нашли бы сперва просто работающее.
>То что у Вас написано, на работающее как-то не смахивает.
Я написал простое для меня решение. Только почему Вы думаете что на рабочее оно не смахивает? Я не спорю, что, возможно, упустил подводные камни, поэтому обращаюсь за помощью. И раз уж Вы, пологаете что это решение как-то не смахивает на робочее, пожалуйста аргументируйте ваше утверждение.
Или быть может я не совсем ясно поставил задачу?
>UPD.
>Сопоставление выполняется со всеми параллельно и одновременно. Если канонически.
Вот честно не понимаю некоторых ваших, хоть убейте)
Я исхожу из такого примера
<?
switch(1)
{
case '1':
$block = "Есть соответствие и это собщение напечатается";
break;
case '1':
$block = "Есть соответствие и это собщение не напечатается";
break;
}
echo $block;
?>
|
В учебнике Котерова говорится, что если сопоставление обнаружено, то следующая и последующие строки во внимание не принимаются. | |
|
|
|
|
|
|
|
для: admiral
(19.12.2009 в 00:17)
| | Конечно, вы же break; ставите.
Уберите break'и и у вас от первого совпадения и дальше попрет без остановки. | |
|
|
|