Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php文件列表数组到数组树中_Php_Mysql_Arrays_Json_Tree - Fatal编程技术网

php文件列表数组到数组树中

php文件列表数组到数组树中,php,mysql,arrays,json,tree,Php,Mysql,Arrays,Json,Tree,我有一些元素数量超过100的文件列表数组,我需要将其转换为树数组,并将其插入数据库,然后在调用json api目录系统时返回树 我花了一个星期的时间尝试不同的算法,但都在某个时候失败了。 这是阵列: $files[] = array('dir1/dir2/dir3/file1.mkv', 44444); $files[] = array('dir1/dir2/dir3/file2.mkv', 44444); $files[] = array('dir1/dir2/file1.mkv', 4444

我有一些元素数量超过100的文件列表数组,我需要将其转换为树数组,并将其插入数据库,然后在调用json api目录系统时返回树 我花了一个星期的时间尝试不同的算法,但都在某个时候失败了。 这是阵列:

$files[] = array('dir1/dir2/dir3/file1.mkv', 44444);
$files[] = array('dir1/dir2/dir3/file2.mkv', 44444);
$files[] = array('dir1/dir2/file1.mkv', 44444);
$files[] = array('dir1/dir2/file2.txt', 11111);
$files[] = array('dir1/file1.exe', 22222);
$files[] = array('dir1/file2.exe', 22222);
$files[] = array('file1.rar', 3333);
第一个元素是文件路径,第二个元素是文件大小。 这些文件在此服务器上不存在,它们位于不同的服务器上,这是api服务器。 我需要将其转换为嵌套树数组,如下所示:

Array
(
    [dir1] => Array
        (
            [dir2] => Array
                (
                    [dir3] => Array
                    (
                        [0] => Array
                            (
                                [name] => file1.mkv
                                [size] => 44444
                            )

                        [1] => Array
                            (
                                [name] => file2.mkv
                                [size] => 44444
                            )

                    )

                    [0] => Array
                        (
                            [name] => file1.mkv
                            [size] => 44444
                        )

                    [1] => Array
                        (
                            [name] => file2.txt
                            [size] => 11111
                        )

                )

            [0] => Array
                (
                    [name] => file1.exe
                    [size] => 22222
                )

            [1] => Array
                (
                    [name] => file2.exe
                    [size] => 22222
                )

        )

    [0] => Array
        (
            [name] => file1.rar
            [size] => 3333
        )

)
我写了一些代码,但它只上升到第二级(dir2),然后在第三级(dir3),它无法按预期执行

守则:

foreach ($files as $file)
{
    $info = pathinfo($file[0]);
    if ($info['dirname'] != '.')
    {
        if (strpos($info['dirname'], '/') !== false)
        {
            $dirs[pathinfo($info['dirname'])['dirname']][pathinfo($info['dirname'])['basename']][] = array('name' => $info['basename'], 'size' => $file[1]);
        }
        else
        {
            $dirs[$info['dirname']][] = array('name' => $info['basename'], 'size' => $file[1]);
        }
    }
    else
    {
        $dirs[] = array('name' => $info['basename'], 'size' => $file[1]);
    }
}
如果我从文件列表数组中删除dir3级别,则此代码返回数组,但如果存在dir3,则返回:

Array
(
    [dir1/dir2] => Array
        (
            [dir3] => Array
                (
                    [0] => Array
                        (
                            [name] => file1.mkv
                            [size] => 44444
                        )

                    [1] => Array
                        (
                            [name] => file2.mkv
                            [size] => 44444
                        )

                )

        )

    [dir1] => Array
        (
            [dir2] => Array
                (
                    [0] => Array
                        (
                            [name] => file1.mkv
                            [size] => 44444
                        )

                    [1] => Array
                        (
                            [name] => file2.txt
                            [size] => 11111
                        )

                )

            [0] => Array
                (
                    [name] => file1.exe
                    [size] => 22222
                )

            [1] => Array
                (
                    [name] => file2.exe
                    [size] => 22222
                )

        )

    [0] => Array
        (
            [name] => file1.rar
            [size] => 3333
        )

)

这个[dir1/dir2]就是问题所在,我需要它是一个完美的树,这样我可以通过它递归并将记录插入数据库

因为您事先不知道树的深度,所以不能使用if/else循环来管理它。这是一个需要递归的用例

<?php
function scanpath($path) {
    $myscan = scandir($path);
    $tree=[];
    foreach($myscan as $entry) {
        //echo '<br>'.$entry;
        if($entry==='.' || $entry ==='..') {
            // do nothing
        } else  if(is_dir($path.'/'.$entry)) {
            // this is a folder, I will recurse
            $tree[$entry] = scanpath($path.'/'.$entry);
        } else {
            // this is a file or link. Value is file size
            $tree[$entry] = filesize($path.'/'.$entry);
        }
    }
    return $tree;
}
$scanresult=scanpath(__DIR__);
echo '<pre>';
print_r($scanresult);
echo '</pre>';
这是我的路

$path='E:\conf\transfer';
$objects=new recursiveiterator(new recursivedirectoryinterator($path),recursiveiterator::SELF_FIRST);
$tree_array=array();
foreach($name=>$object形式的对象){
如果(在数组($object->getFilename(),数组(“…”,“.”)中)|是_dir($object->getPathname())
{
继续;
}
$path\u info=explode(目录\u分隔符,$object->getPathname());
$file\u name=array\u pop($path\u info);
$path_info=“[”。内爆(“][”,$path_info)。“]”;
$code='$tree\u array.$path\u info.[]='.\'..$file\u name.\'.';
eval($代码);
}

变量转储($tree\u数组)我说这些文件不存在。它只是一个数组,所以不能执行scandir()或is_dir()。很抱歉。我会在几个小时内给它一个镜头。这将是感激:)似乎我得到了它的工作,请查看我编辑的答案。嘿,对不起,反应太晚了。我已经弄明白了。但是谢谢你的帮助:)
<?php
$thefiles=[];

$thefiles[] = array('dir1/dir2/dir3/file1.mkv', 44444);
$thefiles[] = array('dir1/dir2/dir3/file2.mkv', 44444);
$thefiles[] = array('dir1/dir2/file1.mkv', 44444);
$thefiles[] = array('dir1/dir2/file2.txt', 11111);
$thefiles[] = array('dir1/dir4/file5.mkv', 22444);
$thefiles[] = array('dir1/dir4/file6.txt', 15111);
$thefiles[] = array('dir1/file1.exe', 22222);
$thefiles[] = array('dir1/file2.exe', 22222);
$thefiles[] = array('file1.rar', 3333);

$filearray=[];

function scanpath($patharray,$filesize) {
    $tree=[];
    if(count($patharray)===1) {
        $filename=array_pop($patharray);
        $tree[] = ['name'=>$filename, 'size'=>$filesize];
    } else {
        $pathpart = array_pop($patharray);
        $tree[$pathpart] = scanpath($patharray,$filesize);
    }
    return $tree;
}

foreach($thefiles as $fileentry) {
    $patharray=array_reverse(explode('/',$fileentry[0]));
    $thisarray = scanpath($patharray,$fileentry[1]);
    $filearray= array_merge_recursive($filearray,$thisarray);
}

echo '<pre>';
print_r($filearray);
echo '</pre>';