У меня многомерный массив, вложенный в неизвестную / неограниченную глубину. Я хотел бы иметь возможность прокручивать каждый элемент. Я не хочу использовать 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));