Упростите цикл через массив, который может быть плоским или многомерным - PullRequest
0 голосов
/ 15 сентября 2010

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

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

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

Ответы [ 2 ]

2 голосов
/ 15 сентября 2010

Вы можете использовать RecursiveArrayIterator для перебора значений в массиве, например

$iterator = new RecursiveIteratorIterator(
                new RecursiveArrayIterator($yourArray),
                RecursiveIteratorIterator:SELF_FIRST);

Тогда просто foreach над ним. Дальнейшее чтение:

1 голос
/ 15 сентября 2010

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

foreach($array as $key => $value) {

    if(!is_array($value)) $value = array($value);

    foreach($value as $subkey => $subvalue) {
        //Process $value/$subvalue here    
    }
}

В качестве альтернативы вы можете создать функцию, которая обрабатывает отдельные элементы, а затем вызывать эту же функцию из каждой ветви. Вы все равно будете экономить, записывая процесс дважды.

...