有人可以通过一些代码或说明来帮助我如何递归遍历数组,到达最后一个元素时会打印出该数组的完整路径吗?一个简单的回显将起作用,因为我将使代码适应我正在开发的其他功能。

该函数不需要计算数组维数,因为将传递此参数:

例子:

$depth = 8;

$array[1][3][5][6][9][5][8][9];

当函数到达第8个元素时,它会打印所有路径:
//print path
'1 -> 3 -> 5 -> 6 -> 9 -> 5 -> 8 -> 9'
  • 正如我说的,只有以这种格式打印才能工作,因为我会将代码实现为其他功能。
  • 数组键可以具有相同的值。显然,对于整个arary,在相同序列中的值都不相同。

  • 更新:

    递归行走功能:
    $someArray[1][2][3] = 'end';
    $someArray[1][2][6] = 'end';
    $someArray[1][3][6] = 'end';
    $someArray[4][3][7] = 'end';
    
    function listArrayRecursive(&$array_name, $ident = 0){
        if (is_array($array_name)){
            foreach ($array_name as $k => &$v){
                if (is_array($v)){
                    for ($i=0; $i < $ident * 10; $i++){ echo "&nbsp;"; }
                    echo $k . " : " . "<br>";
                    listArrayRecursive($v, $ident + 1);
                }else{
                    for ($i=0; $i < $ident * 10; $i++){ echo "&nbsp;"; }
                    echo $k . " : " . $v . "<br>";
                }
            }
        }else{
            echo "Variable = " . $array_name;
        }
    }
    
    listArrayRecursive($someArray);
    

    将打印:
    1 :
          2 :
                    3 : end
                    6 : end
          3 :
                    6 : end
    4 :
          3 :
                    7 : end
    

    现在,如何在每次到达数组末尾时也打印它的路径?例如:
    1 :
          2 :
                    3 : end : path -> 1,2,3
                    6 : end : path -> 1,2,6
          3 :
                    6 : end : path -> 1,3,6
    4 :
          3 :
                    7 : end : path -> 4,3,7
    

    编辑代码,添加第三条记录路径:
    $someArray[1][2][3] = 'end';
    $someArray[1][2][6] = 'end';
    $someArray[1][3][6] = 'end';
    $someArray[4][3][7] = 'end';
    $someArray[3][2] = 'end';
    
    function listArrayRecursive(&$array_name, $ident = 0, $path = null){
         foreach ($array_name as $k => &$v){
             if (is_array($v)){
                for ($i=0; $i < $ident * 10; $i++){ echo "&nbsp;"; }
                echo $k . " : " . "<br>";
                $path .= $k . ', ';
                listArrayRecursive($v, $ident + 1, $path);
            }else{
                 for ($i=0; $i < $ident * 10; $i++){ echo "&nbsp;"; }
                 echo $k . " : " . $v . ' - path -> ' . $path . "<br>";
            }
        }
    }
    
    listArrayRecursive($someArray);
    

    将打印:
    1 :
              2 :
                        3 : end - path -> 1, 2,
                        6 : end - path -> 1, 2,
              3 :
                        6 : end - path -> 1, 2, 3,
    4 :
              3 :
                        7 : end - path -> 1, 4, 3,
    3 :
              2 : end - path -> 1, 4, 3,
    

    最佳答案

    您可以使用RecursiveIteratorIterator(docs)来消除遍历数组的繁琐工作。

    function listArrayRecursive($someArray) {
        $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($someArray), RecursiveIteratorIterator::SELF_FIRST);
        foreach ($iterator as $k => $v) {
            $indent = str_repeat('&nbsp;', 10 * $iterator->getDepth());
            // Not at end: show key only
            if ($iterator->hasChildren()) {
                echo "$indent$k :<br>";
            // At end: show key, value and path
            } else {
                for ($p = array(), $i = 0, $z = $iterator->getDepth(); $i <= $z; $i++) {
                    $p[] = $iterator->getSubIterator($i)->key();
                }
                $path = implode(',', $p);
                echo "$indent$k : $v : path -> $path<br>";
            }
        }
    }
    

    10-05 21:10
    查看更多