Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.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_Arrays_Amazon S3_Logic_Hierarchy - Fatal编程技术网

如何从平面数组生成树-php

如何从平面数组生成树-php,php,arrays,amazon-s3,logic,hierarchy,Php,Arrays,Amazon S3,Logic,Hierarchy,我试图用一个可以浏览的树结构来表示从AmazonS3 bucket返回的整个数组 下面是数组示例 $files[0] = 'container/798/'; $files[1] = 'container/798/logo.png'; $files[2] = 'container/798/test folder/'; $files[3] = 'container/798/test folder/another folder/'; $files[4] = 'container/798/test fo

我试图用一个可以浏览的树结构来表示从AmazonS3 bucket返回的整个数组

下面是数组示例

$files[0] = 'container/798/';
$files[1] = 'container/798/logo.png';
$files[2] = 'container/798/test folder/';
$files[3] = 'container/798/test folder/another folder/';
$files[4] = 'container/798/test folder/another folder/again test/';
$files[5] = 'container/798/test folder/another folder/test me/';
$files[6] = 'container/798/test two/';
$files[7] = 'container/798/test two/logo2.png';
$keys = json_decode($result,true);
$folders = array();
$files = array();
$i =0;
foreach ($keys['files'] as $key){
    if(endsWith($key, "/")){
        $exploded = explode('container/'.$_SESSION['id_user'].'/',$key);
        if(!empty($exploded[1]))
        $folders[$i]['name'] = substr($exploded[1],0,-1);
    }
    else{
        $exploded = explode('container/'.$_SESSION['id_user'].'/',$key);
        $files[$i]['name'] = $exploded[1];
        $files[$i]['size'] = "";
        $files[$i]['date'] = "";
        $files[$i]['preview_icon'] = "";
        $files[$i]['dimensions'] = "";
        $files[$i]['url'] = "";
    }
    $i++;
}
这就是我想要实现的

http://i.stack.imgur.com/HBjvE.png   
到目前为止,我只实现了不同的文件和文件夹,但没有在不同的层次上与父子关系。上述数组位于$keys['files']中。代码如下

$files[0] = 'container/798/';
$files[1] = 'container/798/logo.png';
$files[2] = 'container/798/test folder/';
$files[3] = 'container/798/test folder/another folder/';
$files[4] = 'container/798/test folder/another folder/again test/';
$files[5] = 'container/798/test folder/another folder/test me/';
$files[6] = 'container/798/test two/';
$files[7] = 'container/798/test two/logo2.png';
$keys = json_decode($result,true);
$folders = array();
$files = array();
$i =0;
foreach ($keys['files'] as $key){
    if(endsWith($key, "/")){
        $exploded = explode('container/'.$_SESSION['id_user'].'/',$key);
        if(!empty($exploded[1]))
        $folders[$i]['name'] = substr($exploded[1],0,-1);
    }
    else{
        $exploded = explode('container/'.$_SESSION['id_user'].'/',$key);
        $files[$i]['name'] = $exploded[1];
        $files[$i]['size'] = "";
        $files[$i]['date'] = "";
        $files[$i]['preview_icon'] = "";
        $files[$i]['dimensions'] = "";
        $files[$i]['url'] = "";
    }
    $i++;
}

这段代码只是为了表明我正在努力,但它并不完整或准确。我不知道如何接近一个逻辑,可以给我的层次结构,我显示的图片。任何帮助都将不胜感激

我不知道这是不是一种“正确”的方法,但是如果你想建立一个递归结构,那么简单的方法就是使用递归函数:

$root=array('name'=>'/','children'=>array(),'href'=>'';
函数存储_文件($filename,&$parent){
if(空($filename))返回;
$matches=array();
if(preg|u match('|^([^/]+)/(.*)$|',$filename,$matches)){
$nextdir=$matches[1];
如果(!isset($parent['children'][$nextdir])){
$parent['children'][$nextdir]=数组('name'=>$nextdir,
'children'=>array(),
'href'=>$parent['href']./'。$nextdir);
}
存储文件($matches[2],$parent['children'][$nextdir]);
}否则{
$parent['children'][$filename]=数组('name'=>$filename),
“大小”=>“…”,
'href'=>$parent['href']./'.$filename);
}
}
foreach($files作为$file){
存储文件($file,$root);
}

现在,
root['children']
的每个元素都是一个关联数组,可以散列有关文件或其自身的
子数组的信息。

我不知道这是否是执行此操作的“正确”方法,但如果要创建递归结构,那么简单的方法是使用递归函数:

$root=array('name'=>'/','children'=>array(),'href'=>'';
函数存储_文件($filename,&$parent){
if(空($filename))返回;
$matches=array();
if(preg|u match('|^([^/]+)/(.*)$|',$filename,$matches)){
$nextdir=$matches[1];
如果(!isset($parent['children'][$nextdir])){
$parent['children'][$nextdir]=数组('name'=>$nextdir,
'children'=>array(),
'href'=>$parent['href']./'。$nextdir);
}
存储文件($matches[2],$parent['children'][$nextdir]);
}否则{
$parent['children'][$filename]=数组('name'=>$filename),
“大小”=>“…”,
'href'=>$parent['href']./'.$filename);
}
}
foreach($files作为$file){
存储文件($file,$root);
}

现在,
root['children']
的每个元素都是一个关联数组,它散列了关于文件的信息或它自己的
children
数组。

可能的重复在我的示例中没有父id,这对我来说有点困难。可能的重复在我的示例中没有父id,这对我来说有点困难。这是我需要的,谢谢。但现在我有点困惑于如何如图所示显示它。列出文件也是递归的:要列出文件,首先打印文件名(和元数据),然后列出每个文件的子文件。如果我们不打印,而是附加到垂直布局,同时跟踪每个文件的深度以添加缩进,我们可以创建一个层次视图。我做到了。帮了大忙,谢谢。:)@一百万我想把url保存到数组中的文件夹中,就像名称或大小一样。我不知道如何为每个文件或文件夹分配完整路径或url。你能帮我吗?有几种简单的方法可以做到这一点,因为文件列表包含每个文件的完整路径。假设我们想在每个条目中添加一个
href
字段。首先,手动将
$root['href']
设置为基本路径或URL应该是什么-类似于
https://s3.amazonaws.com/yourbucket/...
。您还可以将其初始化为空字符串以获取路径而不是URL。现在,根据我们对路径工作原理的了解,每当我们创建一个新的子条目时,我们都可以将
$child['href']
指定为其父路径,并附加斜杠和子路径名。这就是我需要的,谢谢。但现在我有点困惑于如何如图所示显示它。列出文件也是递归的:要列出文件,首先打印文件名(和元数据),然后列出每个文件的子文件。如果我们不打印,而是附加到垂直布局,同时跟踪每个文件的深度以添加缩进,我们可以创建一个层次视图。我做到了。帮了大忙,谢谢。:)@一百万我想把url保存到数组中的文件夹中,就像名称或大小一样。我不知道如何为每个文件或文件夹分配完整路径或url。你能帮我吗?有几种简单的方法可以做到这一点,因为文件列表包含每个文件的完整路径。假设我们想在每个条目中添加一个
href
字段。首先,手动将
$root['href']
设置为基本路径或URL应该是什么-类似于
https://s3.amazonaws.com/yourbucket/...
。您还可以将其初始化为空字符串以获取路径而不是URL。现在,根据我们对路径工作原理的了解,每当我们创建一个新的子条目时,我们可以将
$child['href']
指定为其父路径,并附加斜杠和子路径名。