PHP从平面数组

时间:2017-11-01 00:36:22

标签: php

我有一个查看目录并返回文件结构数组的方法,其示例如下;

Array
(
    [0] => filename.png
    [directory] => Array
        (
            [subdirectory] => Array
                (
                    [0] => filename.jpg
                )

        )

    [directory] => Array
        (
            [0] => filename.png
        )

    [directory] => Array
        (
        )

    [directory] => Array
        (
            [0] => filename.png
        )

    [directory] => Array
        (
            [0] => filename.png
        )

)

我用来构建它的代码如下:

function dirToArray($dir) {
    $contents = array();

    foreach (scandir($dir) as $node) {
        if ($node == '.' || $node == '..') continue;

        if (is_dir($dir . '/' . $node)) {
            $contents[$node] = dirToArray($dir . '/' . $node);
        } else {
            $contents[] = $node;
        }
    }

    return $contents;
}

我需要将其展平,以便我可以显示它,就像你在这里看到的那样;

filename.png
directory
.. subdirectory
.. .. filename.png
directory
.. filename.png
directory
.. filename.png
directory
.. filename.png

问题是,我需要在没有变化的json结构中输入数据。 结构的描述如下:文件的完整路径,然后是要显示的文本,最后是“叶子”。 (file = true,directory = false)

这应该是它的样子;

[ ['fullpath', 'displaytext', 'true'],['fullpath', 'displaytext', 'false'] ]

我真的很困惑如何解决这个问题,非常感谢任何帮助。

谢谢

1 个答案:

答案 0 :(得分:1)

我的方法是:

 $res=[]; 
 function flatten ($in, $dir, $dots, &$result) { 
   $tmp = [];
   if (is_array($in)) { 
     $tmp[0] = $dir;
     $tmp[1] = $dots.'Directory'; //displaytext
     $tmp[2] = false;
     $result[] = $tmp;
     $dots = $dots.'.. ';
     foreach($in as $k => $v) flatten($v, $dir.'/'.$k, $dots, $result); 
   } else {
     $tmp[0] = $dir.'/'.$in;
     $tmp[1] = $dots.$in; //displaytext
     $tmp[2] = true;
     $result[] = $tmp;
   }
 }
 flatten($array, '','', $res); //$array is the array you created
 echo json_encode($res);

但代码未经过测试。我们的想法是递归地对密钥(目录)进行汇总,直到您到达叶子(文件),并将所有内容存储在通过引用传递的数组中。

最后一次编辑应该最终修复它。