我有一个嵌套到未知/无限深度的多维数组。
我希望能够遍历每个元素。
我不想使用foreach(){foreach(){foreach(){}}}
因为我不知道深度。
我最终会寻找所有名为“xyz
”的嵌套数组。有没有人有任何建议?
答案 0 :(得分:10)
我最终会寻找所有名为“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
标志来使非叶(即父)项(即数组)可见。
你也可以在数组迭代器周围使用ParentIterator
,而不是在循环中检查数组,以使后者更整洁。
答案 1 :(得分:3)
递归。
编写一个遍历一个数组的函数;对于也是数组的每个元素,它自己调用;否则,当它找到目标字符串时,它会返回。
答案 2 :(得分:3)
未知和无限之间存在巨大的差异。但是,您可以使用SPL Iterators而不是使用多个嵌套的foreach
循环。
示例:强>
$array_obj = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
foreach($array_obj as $key => $value) {
echo $value;
}
答案 3 :(得分:1)
查看RecursiveIteratorIterator界面。
$interface = new RecursiveIteratorIterator( new RecursiveArrayIterator($your_array) );
foreach($interface as $k=>$v) { /* your function*/ }
答案 4 :(得分:1)
使用上面的评论,我找到了答案:
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无法实现此目的。
答案 5 :(得分:0)
您是否考虑过使用array_walk_recursive?
在执行搜索之前,另一个(较慢的)方法是flatten the array,即:
$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());
或者,对于递归搜索,请参阅here以获取示例:
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));