Упростите цикл через массив, который может быть плоским или многомерным

Часто у меня будет массив, содержащий набор значений, каждый из которых мне нужно обработать. Иногда массив будет содержать только один набор, и в этом случае каждое значение должно быть передано через процесс. В других случаях массив будет содержать множество множеств, и в этом случае каждое значение будет массивом, и каждое значение этих массивов необходимо будет обработать. Вот пример:

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 и тест массива всякий раз, когда я хочу вызвать мою функцию проверки.

Есть ли более простой способ сделать это?

Solutions Collecting From Web of "Упростите цикл через массив, который может быть плоским или многомерным"

Оберните единственное значение в массив, а затем продолжайте, как обычно:

 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 через него. Дальнейшее чтение: