嵌套数组有一个foreach循环?

时间:2010-04-13 13:08:30

标签: php foreach

我需要访问一个看起来像这样的数组。

Array
(
    [0] => Array
        (

            [54] => Array
            (
                [test] => 54
                [tester] => result
            )
         )
)

foreach($array as $key=>$value)
{
  echo $key;// prints 0
  echo $value;// prints Array
  /*
   now i can iterate through $value but i dont want it solve that way example:
  foreach($value as $k=>$v)
  {
    echo $k;//prints test
    echo $v; //prints 54
  }
  */

}

如何只迭代一次?获取测试测试人员的值? 我希望我能解释清楚问题

3 个答案:

答案 0 :(得分:4)

使用SPLRecursiveDirectoryIterator

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

foreach($iterator as $key => $val) {
    if($key === 'test' || $key === 'tester') {
        echo "$key = $val \n";
    }
}

这将找到值为 test tester 的所有数组元素,无论它在多维数组中出现在何处。如果必须将其缩小到数组中的特定深度,则可以匹配$iterator->getDepth()


您还可以将if条件放入FilterIteratoraccept()方法的方法体中,例如

class TestFilter extends FilterIterator
{
    public function accept()
    {
        return ($this->key() === 'test' || $this->key() === 'tester');
    }
}

然后在foreach之前将迭代器包装在其中,例如

$iterator = new TestFilter($iterator); // wrap iterator from first example
foreach($iterator as $key => $val) {
    echo "$key = $val \n";    
}

进一步阅读:

答案 1 :(得分:1)

您可以使用匿名函数列出项目。每次遇到数组作为元素时,这将使用递归:

array_walk_recursive($array, create_function('$item, $key', 
    'echo "$key => $item<br />";'
));

或者在使用PHP 5.3时:

array_walk_recursive($array, function($item, $key) { 
    echo "$key => $item<br />";
});

这比create_function()更快(也更可读)。但是,此构造仅在PHP 5.3及更高版本中可用。

两者都会输出:

test => 54
tester => result

我相信这正是你想要的。

答案 2 :(得分:0)

这只适用于此特定数组:

foreach($array[0][54] as $key=>$value)
{
    echo $key;// prints test and tester
    echo $value;// prints 54 and result
}