PHP RecursiveArrayIterator类获取递归键值对
我试图用PHP的工厂类编写一个自定义数组迭代器。我的问题:我需要所有数组的所有数据,例如,这里有一个简单的PHP数组:PHP RecursiveArrayIterator类获取递归键值对,php,arrays,iterator,Php,Arrays,Iterator,我试图用PHP的工厂类编写一个自定义数组迭代器。我的问题:我需要所有数组的所有数据,例如,这里有一个简单的PHP数组: Array ( [authentication] => Array ( [basic] => Array ( [username] => guest [password] => guest
Array
(
[authentication] => Array
(
[basic] => Array
(
[username] => guest
[password] => guest
)
[filters] => Array
(
[price] => 100
[owener] => me
)
)
)
我在PHP的doc页面上看到,我可以使用两个简单类,并使用simple foreach进行迭代:
$iterator = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($this->phpArray));
foreach($iterator as $key => $value) {
$d = $iterator->getDepth();
echo "depth: $d $key => $value\n";
}
此程序将抛出以下输出:
depth: 2 key: username, value: guest
depth: 2 key: password, value: guest
depth: 2 key: price, value: 100
depth: 2 key: owener, value: me
如何修改我的代码如何处理以下示例输出的所有数据:
depth: 0 key: authentication, value:
depth: 1 key: basic, value:
depth: 1 key: filters,
depth: 2 key: username, value: guest
depth: 2 key: password, value: guest
depth: 2 key: price, value: 100
depth: 2 key: owener, value: me
谢谢大家! 或者,您可以使用如下递归函数:
function traverseArray($arr, &$depthArray, $depth = 0){
foreach($arr as $key => $value){
if(is_array($value)){
$depthArray[$depth][] = array('depth' => $depth, 'key' => $key, 'value' => '');
traverseArray($value, $depthArray, ++$depth);
--$depth;
}else{
$depthArray[$depth][] = array('depth' => $depth, 'key' => $key, 'value' => $value);
}
}
}
$depthArray = array();
traverseArray($this->phpArray, $depthArray);
foreach($depthArray as $depth => $arr){
foreach($arr as $a){
echo 'depth:' . $a['depth'] . ' key: ' . $a['key'] . ' value: ' . $a['value'] . '<br />';
}
}
创建一个名为$depthArray
的空数组,并使用两个参数调用此函数,第一个参数是原始数组$this->phpArray
,第二个参数是this$depthArray
,如下所示:
function traverseArray($arr, &$depthArray, $depth = 0){
foreach($arr as $key => $value){
if(is_array($value)){
$depthArray[$depth][] = array('depth' => $depth, 'key' => $key, 'value' => '');
traverseArray($value, $depthArray, ++$depth);
--$depth;
}else{
$depthArray[$depth][] = array('depth' => $depth, 'key' => $key, 'value' => $value);
}
}
}
$depthArray = array();
traverseArray($this->phpArray, $depthArray);
foreach($depthArray as $depth => $arr){
foreach($arr as $a){
echo 'depth:' . $a['depth'] . ' key: ' . $a['key'] . ' value: ' . $a['value'] . '<br />';
}
}
最后,使用嵌套的foreach
循环遍历$depthArray
并显示该元素的键、值和相关深度,如下所示:
function traverseArray($arr, &$depthArray, $depth = 0){
foreach($arr as $key => $value){
if(is_array($value)){
$depthArray[$depth][] = array('depth' => $depth, 'key' => $key, 'value' => '');
traverseArray($value, $depthArray, ++$depth);
--$depth;
}else{
$depthArray[$depth][] = array('depth' => $depth, 'key' => $key, 'value' => $value);
}
}
}
$depthArray = array();
traverseArray($this->phpArray, $depthArray);
foreach($depthArray as $depth => $arr){
foreach($arr as $a){
echo 'depth:' . $a['depth'] . ' key: ' . $a['key'] . ' value: ' . $a['value'] . '<br />';
}
}
foreach($depthArray as$depth=>$arr){
foreach($arr作为$a){
回显'depth:'.$a['depth'.'键:'.$a['key'.'值:'.$a['value'.].
;
}
}
使用时,可以设置不同的遍历模式。默认值是递归迭代器::只剩下。这就是为什么只得到叶子,而不是所有的值(顺便说一句,它们的行为是相同的)。要访问所有元素,需要先将模式设置为递归迭代器::SELF\u
:
$iterator = new \RecursiveIteratorIterator(
new \RecursiveArrayIterator($array),
\RecursiveIteratorIterator::SELF_FIRST
);
这是。@Gábor,不客气。迭代器的文档记录确实很糟糕,很难正确使用。