Когда вам нужно проверить / иметь комбинации элементов массива, как вы можете избежать вложенности foreach?
Пример кода:
$as = array($optionA1, $optionA2) $bs = array($optionB1, $optionB2) $cs = array($optionC1, $optionC2) foreach ($as as $a) { foreach ($bs as $b) { foreach ($cs as $c) { $result = $this->method($a, $b, $c); if ($result) etc } } }
Кто-нибудь с альтернативными подходами, которые могут избежать гнездования?
Вы можете написать свой собственный класс Iterator, который реализует интерфейс Iterator . Затем вы можете использовать его конструктор для трех массивов, а затем вы можете использовать его для циклического использования каждой комбинации с помощью foreach.
Однако я думаю, что это будет значительно медленнее, поэтому я бы избегал этого. Было бы интересно узнать причины, по которым вы хотите избежать вложенных петлей foreach?
По логике, вы должны проходить через каждый элемент. Вы просто перетасовываете процесс.
Если несколько циклов для циклов выглядят уродливыми, возможно, вы должны поместить свои массивы в свои классы, у которых есть свои инкапсулированные «проверки».
Считаете ли вы, что считать количество каждого массива и умножить их все вместе, чтобы получить общее количество перестановок, а затем сделать для i, чтобы итерация, подсчет? Вам нужно было бы сделать несколько смежных манипуляций счетчиком для каждого массива, но он должен работать.
Вы не дали достаточно информации, чтобы знать, что такое альтернатива. Если вы действительно хотите вызывать метод () со всеми комбинациями опций из $ as, $ bs и $ cs, тогда вложенные циклы будут поступать правильно.
Является ли это многократно вложенными циклами, которые вас беспокоят, или тот факт, что метод () называется count ($ as) * count ($ bs) * count ($ cs) раз?