2010-04-13 65 views
2

我需要访问一个看起来像这样的数组。带有一个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 
    } 
    */ 

} 

如何迭代一次?得到的测试值测试仪? 我希望我能解释我的问题明确

+0

数组是否只有一个数组(它包含更多的数组)还是它有许多包含许多数组的数组?你需要为你的测试数组提供一个更好的例子。 – zaf 2010-04-13 13:13:35

+0

你还允许像array_map等其他功能...? – zaf 2010-04-13 13:15:42

+0

@zaf它包含许多数组的数组 – streetparade 2010-04-13 13:17:12

回答

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"; 
    } 
} 

这会发现无论是测试测试仪的数值的所有数组元素,无论它出现在多维数组。如果您必须将其缩小到阵列中的特定深度,则可以匹配$iterator->getDepth()


还可以把如果条件成FilterIteratoraccept()方法,例如所述的方法体

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

,然后包裹在迭代它foreach前9C它,例如

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

延伸阅读:

+0

谢谢,我会试一试 – streetparade 2010-04-13 13:20:41

+0

对于它的价值,如果我对问题的解释是正确的,那么您只是想从中获得最深的(即非数组)项目数组,那么可以通过使用'new RecursiveIteratorIterator(new RecursiveArrayIterator($ array))'来使生活变得更简单,并且在'foreach'循环中没有任何条件。 – salathe 2010-04-14 22:42:05

+0

@salathe授予,如果你从字面上看OP的例子,那么默认的LEAVES_ONLY就足够了。 – Gordon 2010-04-14 22:59:32

0

这将仅适用于该特定阵列工作:

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

Noop那不是我需要它应该[120] [2]和不久 – streetparade 2010-04-13 13:17:58

+0

这个答案不应该被拒绝,公平的方式太具体,但这个问题并没有真正提供太多的方式一个合适的数组结构,只是一个非常基本的例子。 – 2010-04-13 13:34:15

1

你可以使用匿名函数列表中的项目。使用PHP 5.3

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

或者当::这将使用递归每一个阵列中遇到作为元素时间

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

这将是比create_function更快(更可读的)()。然而,这个构造仅在PHP 5.3及更高版本中可用。

双方将输出:

test => 54 
tester => result 

这是你想要什么,我相信。