【问题标题】:How to recursively build a json from string如何从字符串递归构建json
【发布时间】:2017-03-20 09:34:18
【问题描述】:

我正在尝试从字符串映射 JSON 有我的字符串

files/a/b.txt

我想像这样映射一个 JSON

{
    "name" => "files",
    "path" => "files",
    "type" => "folder",
    "items" => [{
        "name" => "a",
        "path" => "files/a",
        "type" => "folder",
        "items" => [{
            "name" => "b.txt",
            "path" => "files/a/b.txt",
            "type" => "file",
        }]
    }]
}

这里我展示了一个子文件夹,但它可以是无限的子文件夹。 任何帮助将不胜感激。谢谢。

更新: 这就是我现在所拥有的

$str = "files/a/b.txt";
$path = explode("/",$str);
$num = count($path);
$num = --$num;
$files = array();
if($num > 2) {
    foreach ($path as $keys => $value) {
        if($keys > 1 && $keys < $num) {
            $files[] = array(
            "name" => $value,
            "type" => "folder",
            "path" => $path[0]."/".$path[1]."/".$value,
            "items" => 
            );
        }
    }
}else{
    $files[] = array(
    "name" => $path[2],
    "type" => "file",
    "path" => $path[0]."/".$path[1]."/".$path[],
    "size" => filesize($path[0]."/".$path[1]."/".$path[])
    );
}
echo json_encode($files);

但我不知道如何编写项目部分。此代码仅适用于一个子文件夹,仍然无法将文件包含在文件夹项目中。

注意:考虑路径不一定存在。

【问题讨论】:

  • 欢迎来到 SO。向我们展示您目前拥有的代码,这里的人会帮助您,但他们不会为您编写代码。
  • 这是整个代码吗?你能告诉我们整个功能吗?如果是这样,那么您必须使用循环才能递归地遍历所有文件夹。
  • @AnthonyGranger 是的,这是整个代码。我可以递归地写入映射文件夹。但我不需要它来列出所有文件夹。例如,我只需要它来列出文件夹'b'而不是显示“文件”文件夹中的所有子文件夹

标签: php arrays json subdirectory


【解决方案1】:

我不知道如何在 php 中执行,但在 javascript 中会是这样的:

function myFunction(myString) 
{
    var object={};
    var path="";
    var array=myString.split("/"); 
    var items=[];
    if(array.length==1)
    {
        object={
                "name":array[0],
                "path":array[0],
                "type":"file"
            }
    } else{
        var path= array[0];
        var object={
                "name":array[0],
                "path":path,
                "type":"folder"
        }
        array.splice(0,1);
        object.items=[recursiveCall(array,path)]
    }
}

function recursiveCall(array,path){
            if(array.length==1){
                return {
                        "name":array[0],
                        "path":path+"/"+array[0],
                        "type":"file"
                    }

            }else{
                path=path+"/"+array[0];
                var obj={
                        "name":array[0],
                        "path":path,
                        "type":"folder"
                }
                array.splice(0,1);//remove first element
                obj.items=[recursiveCall(array,path)]
                return obj;
            }
         }

【讨论】:

  • 感谢您的帮助,但由于某种原因我无法使用 javascript。我只能使用 PHP
  • 是的,我知道您需要 php,但您可以将我的代码翻译成 php。我测试了代码并在 js 中工作:D
  • 我试过了,但我做不到。我对 javascript 的了解不够 :(
猜你喜欢
  • 2020-09-04
  • 2019-06-03
  • 2017-10-08
  • 2021-03-24
  • 2016-02-10
  • 2021-12-28
  • 1970-01-01
  • 2019-04-02
  • 2013-11-28
相关资源
最近更新 更多