Часто у меня будет массив, содержащий набор значений, каждый из которых мне нужно обработать. Иногда массив будет содержать только один набор, и в этом случае каждое значение должно быть передано через процесс. В других случаях массив будет содержать множество множеств, и в этом случае каждое значение будет массивом, и каждое значение этих массивов необходимо будет обработать. Вот пример:
foreach($array as $key => $value) { if(is_array($value)) { foreach($value as $subkey => $subvalue) { //Process $subvalue here } } else { //Process $value here } }
Проблема в том, что код для обработки $ value / $ subvalue идентичен, за исключением того, что он работает с другой переменной. Одним из способов упростить это было бы превращение этого кода в функцию, но все же кажется, что он не должен требовать двойного вызова. Кроме того, это оставило бы довольно много кода (петли foreach и тест массива) вне этой функции. Например, скажем, что процесс является валидацией, я не хочу писать две петли foreach и тест массива всякий раз, когда я хочу вызвать мою функцию проверки.
Есть ли более простой способ сделать это?
Оберните единственное значение в массив, а затем продолжайте, как обычно:
foreach($array as $key => $value) { if(!is_array($value)) $value = array($value); foreach($value as $subkey => $subvalue) { //Process $value/$subvalue here } }
В качестве альтернативы вы можете создать функцию, которая обрабатывает обработку отдельных элементов, а затем вызывать эту же функцию из каждой ветки. Вы все равно в конечном итоге сохраните процесс записи дважды.
Вы можете использовать RecursiveArrayIterator
для итерации по значениям в массиве, например
$iterator = new RecursiveIteratorIterator( new RecursiveArrayIterator($yourArray), RecursiveIteratorIterator:SELF_FIRST);
Затем просто foreach
через него. Дальнейшее чтение: