bry*_*yan 6 php arrays recursion multidimensional-array
我有以下(json)对象:
$obj = json_decode('{
"Group1": {
"Blue": {
"Round": [
"Harold",
"Arthur",
"Tom"
]
},
"Green": {
"Round": [
"Harold"
],
"Circle": [
"Todd",
"Mike"
]
}
},
"Group2": {
"Blue": {
"Round": [
"Peter"
]
}
}
}', true);
Run Code Online (Sandbox Code Playgroud)
我试图弄清楚如何递归遍历它,这样我就可以看到数组中的所有不同路径.
它可以是4个独立的回声或4行的回声.在>
可以与任何事或什么都没有更换.如果每条线都单独回显或推送到可能提供最大灵活性的阵列.
Group1 - Blue - Round - (Harold, Arthur, Tom)
Group1 - Green - Round - (Harold)
Group1 - Green - Circle - (Todd, Mike)
Group2 - Blue - Round - (Peter)
Run Code Online (Sandbox Code Playgroud)
我无法绕过它,所以任何帮助都会受到赞赏.
我想我可以以某种方式循环每个像:
foreach($obj as $index => $value)
{
// and then somehow do this until you reach an array?
}
Run Code Online (Sandbox Code Playgroud)
仅在给定样本上测试.但是如果阵列级别增加,这应该可行.我主要使用RecursiveIteratorIterator
类函数
// Initialize RecursiveIteratorIterator
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($obj), RecursiveIteratorIterator::SELF_FIRST);
$paths = array(); // Paths storage
foreach ($iterator as $k => $v) { // Loop thru each iterator
if (!$iterator->hasChildren()) { // Check if iterator hasChildren is false
$innermost = $iterator->getSubIterator($iterator->getDepth()); // Get innermost child which is the array
for ($p = array(), $i = 0, $z = $iterator->getDepth(); $i <= $z; $i++) { // Loop and push each path to the innermost array
$p[] = $iterator->getSubIterator($i)->key();
}
array_pop($p); // Remove key
$innermost = (array)$innermost; // Cast innermost to array
$p[] = '(' . implode(', ', $innermost) . ')'; // push formatted innermost array to path
$path = implode(' - ', $p); // implode the path
$paths[] = $path; // store to list of paths array
}
}
$paths = array_unique($paths); // remove exactly same paths
foreach ($paths as $value) { // Loop and echo each path
echo $value.'<br>';
}
Run Code Online (Sandbox Code Playgroud)
输出: - https://eval.in/915070