Проверить значения в массиве smatry
Есть массив, имеет значения:
array(3) {
[0]=>
string(3) "371"
[1]=>
string(3) "385"
[2]=>
string(3) "369"
}
Значения могут быть на любых местах. Необходимо проверить есть ли в массиве значение 371, есть ли в массиве значение 385, есть ли в массиве значения 371 и 385 одновременно. Задача в том, что если есть хотя бы одно из этих значений, то записать в массив какое-то значение и больше не обращать внимание на эти числа.
Первые два условия, допустим, не сложные, но вот третье не могу понять как сделать. Я так понимаю, что сперва необходимо проверять существуют ли в массиве оба эти значения сразу и если нет, то проверять по отдельности.
{foreach $mass as $m}
{if $m == "371"}
{$cname[] = "1"}
{elseif $m == "385"}
{$cname[] = "1"}
{/if}
{/foreach}
Пока нашёл только такое решение, может кто-то знает более правильное
{foreach $mass as $m}
{if $m == "371" || $m == "385"}
{if $cname[0] != "1" && $cname[1] != "1"}
{$cname[] = "1"}
{/if}
{/if}
{if $m == "369"}
{$cname[] = "2"}
{/if}
{/foreach}
В моём случае это выход, так как значение у меня может быть в одной из двух ячеек. Но это не выход, если ячеек может быть неопределённое количество.
Ответы (1 шт):
я бы сказал что такая логика не совсем подходит для самого представления и подобные проверки надо проводить на этапе бизнес-логики, а не представления.
но тем не менее. Никто вам не мешает в smarty использовать функции поиска in_array
То есть можете сделать цепочку проверок
{if in_array(371,$mass) && in_array(385, $mass)}...
{elseif in_array(371,$mass)}....
{elseif in_array(385, $mass)}...
{/if}
в целом обычный вызов in_array() можно переписать в виде модификатора. Значение к которому применяется модификатор передается в функцию первым, а далее все параметры. Так что посольку сигнатура in_array это ($needle, $haystack) то выглядеть это будет как 371|in_array:$mass
Возможно, от массива значений лучше перейти к ключам. Проверка наличия ключа в массиве куда проще, чем поиск самого значения. Тем более, если от ключа зависит итоговое значение:
[371 => 1, 385 => 1, 369 => 2]
в общем говоря, ваш последний фрагмент кода, можно изменить на примерное такое (я правда не особо понял откуда в задаче берется $cname и т.п. и про какие ячейки речь):
{if $mass[371] || $mass[385]}
{if !in_array($cname, 1)}
{$cname[] = 1}
{/if}
{/if}
{if $mass[369]}
{$cname[] = 2}
{/if}
В использовании циклов здесь необходимости нет.