如何从平面数组生成树-php
我试图用一个可以浏览的树结构来表示从AmazonS3 bucket返回的整个数组 下面是数组示例如何从平面数组生成树-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
$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']
指定为其父路径,并附加斜杠和子路径名。