Многомерные массивы, вложенные в неограниченную глубину

У меня многомерный массив, вложенный в неизвестную / неограниченную глубину. Я хотел бы иметь возможность прокручивать каждый элемент. Я не хочу использовать foreach(){foreach(){foreach(){}}} поскольку я не знаю глубины.

В конце концов я ищу все вложенные массивы, называемые « xyz ». У кого-нибудь есть предложения?

В конце концов я ищу все вложенные массивы, называемые «xyz». У кого-нибудь есть предложения?

Конечно. Основываясь на предложениях по использованию некоторых итераторов, вы можете:

 $iterator = new RecursiveIteratorIterator( new RecursiveArrayIterator($array), RecursiveIteratorIterator::SELF_FIRST ); foreach ($iterator as $key => $item) { if (is_array($item) && $key === 'xyz') { echo "Found xyz: "; var_dump($item); } } 

Важное различие между другими ответами заключается в том, что флаг RecursiveIteratorIterator::SELF_FIRST используется для RecursiveIteratorIterator::SELF_FIRST (т.е. родительских) элементов (то есть массивов) при повторном запуске.

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

Рекурсия.

Напишите функцию, которая перемещается по одному массиву; для каждого элемента, который также является массивом, он называет себя; в противном случае, когда он находит целевую строку, он возвращается.

Существует огромная разница между неизвестным и неограниченным. Однако вы можете использовать Итераторы SPL вместо использования нескольких вложенных циклов foreach .

Пример:

 $array_obj = new RecursiveIteratorIterator(new RecursiveArrayIterator($array)); foreach($array_obj as $key => $value) { echo $value; } 

Взгляните на интерфейс RecursiveIteratorIterator .

 $interface = new RecursiveIteratorIterator( new RecursiveArrayIterator($your_array) ); foreach($interface as $k=>$v) { /* your function*/ } 

Используя вышеприведенные комментарии, я нашел ответ:

 function findXyz($array){ foreach($array as $foo=>$bar){ if (is_array($bar)){ if ($bar["xyz"]){ echo "<br />The array of xyz has now been found"; print_r($bar['xyz']); }else{ findXyz($bar); } } } } findXyz($myarray); 

Это перемещает все вложенные массивы и ищет любой элемент, у которого есть подматрица xyz, согласно моему первоначальному запросу. array_walk_array и RecursiveIteratorIterator не смогли этого добиться.

Вы думали об использовании array_walk_recursive для этого?

Другим (более медленным) подходом было бы сначала сгладить массив перед выполнением поиска, то есть:

 $myarray = array('a','b',array(array(array('x'),'y','z')),array(array('p'))); function array_flatten($array,$return) { for($x = 0; $x <= count($array); $x++) { if(is_array($array[$x])) { $return = array_flatten($array[$x],$return); } else { if($array[$x]) { $return[] = $array[$x]; } } } return $return; } $res = array_flatten($myarray,array()); 

Или, для рекурсивного поиска, см. Здесь пример:

 function arrayRecursiveSearch($needle, $haystack, $path=""){ if(!is_array($haystack)){ die("second argument is not array"); } global $matches; foreach($haystack as $key=>$value) { if(preg_match("/$needle/i", $key)){ $matches[] = array($path . "$key/", "KEY: $key"); } if(is_array($value)){ $path .= "$key/"; arrayRecursiveSearch($needle, $value, $path); unset($path); }else{ if(preg_match("/$needle/i", $value)){ $matches[] = array($path . "$key/", "VALUE: $value"); } } } return $matches; } $arr = array("Asia"=>array('rambutan','duku'), "Australia"=>array('pear','kiwi'), "Arab"=>array('kurma')); print_r(arrayRecursiveSearch("ra",$arr)); с function arrayRecursiveSearch($needle, $haystack, $path=""){ if(!is_array($haystack)){ die("second argument is not array"); } global $matches; foreach($haystack as $key=>$value) { if(preg_match("/$needle/i", $key)){ $matches[] = array($path . "$key/", "KEY: $key"); } if(is_array($value)){ $path .= "$key/"; arrayRecursiveSearch($needle, $value, $path); unset($path); }else{ if(preg_match("/$needle/i", $value)){ $matches[] = array($path . "$key/", "VALUE: $value"); } } } return $matches; } $arr = array("Asia"=>array('rambutan','duku'), "Australia"=>array('pear','kiwi'), "Arab"=>array('kurma')); print_r(arrayRecursiveSearch("ra",$arr));