使用PHP将目录结构(字符串)解析为JSON
我有一个像这样的文件路径字符串数组使用PHP将目录结构(字符串)解析为JSON,php,json,recursive-datastructures,Php,Json,Recursive Datastructures,我有一个像这样的文件路径字符串数组 视频/搞笑/jelloman.wmv 视频/搞笑/bellydance.flv 视频/abc.mp4 视频/june.mp4 视频/cliver.mp4 音频/uptown.mp3 音频/juicy.mp3 fun.wmv 吉米·wmv 赫尔曼·wmv 最终目标是让他们进入jsTree。我根据上面的示例字符串构建了一个原型树。 检查它:首先,我将创建一个递归函数,在目录中迭代到数组中 function ReadFolderDirectory($dir,$l
- 视频/搞笑/jelloman.wmv
- 视频/搞笑/bellydance.flv
- 视频/abc.mp4
- 视频/june.mp4
- 视频/cliver.mp4
- 音频/uptown.mp3
- 音频/juicy.mp3
- fun.wmv
- 吉米·wmv
- 赫尔曼·wmv
检查它:首先,我将创建一个递归函数,在目录中迭代到数组中
function ReadFolderDirectory($dir,$listDir= array())
{
$listDir = array();
if($handler = opendir($dir))
{
while (($sub = readdir($handler)) !== FALSE)
{
if ($sub != "." && $sub != ".." && $sub != "Thumb.db")
{
if(is_file($dir."/".$sub))
{
$listDir[] = $sub;
}elseif(is_dir($dir."/".$sub))
{
$listDir[$sub] = $this->ReadFolderDirectory($dir."/".$sub);
}
}
}
closedir($handler);
}
return $listDir;
}
然后用json\u encode
输出数组
源代码使用自:我能够使用这个优秀的解决方案(由@Casablanca发布的底部解决方案)将上述字符串处理为递归数组结构。
我修复了@Ecropolis选择的使用数组的连接答案。他的初始示例帮助了我,但我同意@RobertPitt的观点,即我需要一个json_编码才能真正成为一个好的解决方案
$filesArray = array('videos/funny/jelloman.wmv','videos/funny/bellydance.flv','videos/abc.mp4','videos/june.mp4','videos/cleaver.mp4','audio/uptown.mp3','audio/juicy.mp3','fun.wmv', 'jimmy.wmv','herman.wmv');
$finalTree = $this->parseArrayToTree($filesArray);
$finalJsonTree = json_encode($finalTree);
function parseArrayToTree($paths) {
sort($paths);
$array = array();
foreach ($paths as $path)
{
$path = trim($path, '/');
$list = explode('/', $path);
$n = count($list);
$arrayRef = &$array; // start from the root
for ($i = 0; $i < $n; $i++)
{
$key = $list[$i];
$arrayRef = &$arrayRef[$key]; // index into the next level
}
}
$dataArray = array();
$dataArray['data'] = array();
$dataArray['data'] = $this->buildUL($array, '');
return $dataArray;
}
function buildUL($array, $prefix) {
$finalArray = array();
foreach ($array as $key => $value)
{
$levelArray = array();
$path_parts = pathinfo($key);
if (!empty($path_parts['extension']) && $path_parts['extension'] != '')
{
$extension = $path_parts['extension'];
}
else
{
if (empty($value))
{
$extension = "";
}
else if (is_array($value))
{
$extension = 'folder';
}
}
if (is_array($value))
{ //its a folder
$levelArray['data'] = $key;
}
else
{ //its a file
$levelArray['data']['title'] = $key;
$levelArray['attr']['href'] = $prefix . $key;
$levelArray['attr']['id'] = $prefix . $key;
$levelArray['icon'] = "images/" . $extension . "-icon.gif";
}
// if the value is another array, recursively build the list$key
if (is_array($value))
{
$levelArray['children'] = $this->buildUL($value, $prefix . $key . "/");
}
$finalArray[] = $levelArray;
} //end foreach
return $finalArray;
}
$filesArray=array('videos/funcy/jelloman.wmv','videos/funcy/bellydance.flv','videos/abc.mp4','videos/june.mp4','videos/cleaver.mp4','audio/uptown.mp3','audio/juicy.mp3','fun.wmv','jimmy.wmv','herman.wmv');
$finalTree=$this->parseArrayToTree($fileArray);
$finalJsonTree=json_encode($finalTree);
函数parseArrayToTree($path){
排序(路径);
$array=array();
foreach($path作为$path)
{
$path=trim($path,“/”);
$list=分解(“/”,$path);
$n=计数($list);
$arrayRef=&$array;//从根开始
对于($i=0;$i<$n;$i++)
{
$key=$list[$i];
$arrayRef=&$arrayRef[$key];//索引到下一级
}
}
$dataArray=array();
$dataArray['data']=array();
$dataArray['data']=$this->buildUL($array');
返回$dataArray;
}
函数buildUL($array,$prefix){
$finalArray=array();
foreach($key=>$value的数组)
{
$levelArray=array();
$path\u parts=pathinfo($key);
如果(!empty($path_parts['extension'])和(&$path_parts['extension'])!=“”)
{
$extension=$path_parts['extension'];
}
其他的
{
if(空($value))
{
$extension=“”;
}
else if(是_数组($value))
{
$extension='folder';
}
}
if(是_数组($value))
{//它是一个文件夹
$levelArray['data']=$key;
}
其他的
{//这是一个文件
$levelArray['data']['title']=$key;
$levelArray['attr']['href']=$prefix.$key;
$levelArray['attr']['id']=$prefix.$key;
$levelArray['icon']=“图像/”$extension.-icon.gif”;
}
//如果该值是另一个数组,则递归地构建list$键
if(是_数组($value))
{
$levelArray['children']=$this->buildUL($value,$prefix.$key.“/”);
}
$finalArray[]=$levelArray;
}//结束foreach
返回$finalArray;
}
您应该修复格式设置。。。粘贴所有代码,然后使用{}按钮获得正确的缩进。(或将所有内容缩进4个空格)。我看不到您的结构中的递归性…文件夹“搞笑”嵌套在文件夹“视频”中,我只嵌套了一个级别,但可以继续。我似乎永远也搞不懂这件事!对不起,我把上面的文件名作为字符串放在数组中。因为我没有用PHP读取实际目录,所以我无法访问像is_file这样的函数,也许这就是我真正需要了解的。在我的例子中,如果我在“/”上拆分,则文件是数组中分解字符串的最后一个元素。(文件字符串来自对AmazonS3的查询)@RobertPitt试图使用RecursiveIterator获得类似的结果。感谢您在这方面提供的帮助。PHP致命错误:未捕获错误:不在对象上下文中时使用$This我否决了您尝试手动创建json对象,只使用串联,请参阅实际提供的复杂性json\u encode
$filesArray = array('videos/funny/jelloman.wmv','videos/funny/bellydance.flv','videos/abc.mp4','videos/june.mp4','videos/cleaver.mp4','audio/uptown.mp3','audio/juicy.mp3','fun.wmv', 'jimmy.wmv','herman.wmv');
$finalTree = $this->parseArrayToTree($filesArray);
$finalJsonTree = json_encode($finalTree);
function parseArrayToTree($paths) {
sort($paths);
$array = array();
foreach ($paths as $path)
{
$path = trim($path, '/');
$list = explode('/', $path);
$n = count($list);
$arrayRef = &$array; // start from the root
for ($i = 0; $i < $n; $i++)
{
$key = $list[$i];
$arrayRef = &$arrayRef[$key]; // index into the next level
}
}
$dataArray = array();
$dataArray['data'] = array();
$dataArray['data'] = $this->buildUL($array, '');
return $dataArray;
}
function buildUL($array, $prefix) {
$finalArray = array();
foreach ($array as $key => $value)
{
$levelArray = array();
$path_parts = pathinfo($key);
if (!empty($path_parts['extension']) && $path_parts['extension'] != '')
{
$extension = $path_parts['extension'];
}
else
{
if (empty($value))
{
$extension = "";
}
else if (is_array($value))
{
$extension = 'folder';
}
}
if (is_array($value))
{ //its a folder
$levelArray['data'] = $key;
}
else
{ //its a file
$levelArray['data']['title'] = $key;
$levelArray['attr']['href'] = $prefix . $key;
$levelArray['attr']['id'] = $prefix . $key;
$levelArray['icon'] = "images/" . $extension . "-icon.gif";
}
// if the value is another array, recursively build the list$key
if (is_array($value))
{
$levelArray['children'] = $this->buildUL($value, $prefix . $key . "/");
}
$finalArray[] = $levelArray;
} //end foreach
return $finalArray;
}