Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.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/4/json/13.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将目录结构(字符串)解析为JSON_Php_Json_Recursive Datastructures - Fatal编程技术网

使用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
最终目标是让他们进入jsTree。我根据上面的示例字符串构建了一个原型树。
检查它:

首先,我将创建一个递归函数,在目录中迭代到数组中

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;
  }