首页 > 解决方案 > 使用递归函数构建嵌套数组

问题描述

我得到了一个如下所示的 JSON 对象,它指向一个文件结构。包含对象的对象是文件夹,其他的对象是文件。我正在下载 URL 中的内容(对象可以变大或变小。)

{
    "foo": {
        "bar": "https://file-examples-com.github.io/uploads/2017/10/file_example_JPG_2500kB.jpg",
        "baz": "https://sample-videos.com/img/Sample-jpg-image-100kb.jpg",
        "caz": {
            "zaz": "https://sample-videos.com/img/Sample-jpg-image-100kb.jpg",
            "kaz": {
                "haz": "https://sample-videos.com/img/Sample-jpg-image-100kb.jpg"
            }
        }
    }
}

我正在遍历该对象并从每个键值对生成一个唯一的 id。

这是遍历对象并生成唯一 ID 的递归函数

<?php

function myRecursiveFunc($obj, &$parentId = null, &$result = [])
{
    $result = [];
    $fileNames = array_keys($obj);

    foreach ($fileNames as $fileName) {

        if (is_array($obj[$fileName])) {

            $folderId = uniqueIdBuilder(); //Function that generate unique id

            buildResult($result, $parentId, $folderId, true); // The function to build $result object

            $parentId = $folderId;

            return myRecursiveFunc($obj[$fileName], $parentId, $result);
        } else {

            $url = $obj[$fileName];

            $fileId = uniqueIdBuilder($url);

            buildResult($result, $parentId, $fileId); // The function to build $result object
        
        }
    }
    return $result;
}

生成唯一 ID 部分正在工作。但是,我想构建一个结果对象来显示生成的具有确切文件结构的唯一 ID。

所以结果对象应该是这样的:

[
  'fooId' => [
    'barId',
    'bazId',
    'cazId' => [
        "zazId",
        "kazId" => [
            "hazId"
        ]
  ]
]

我已经创建了我将在下面展示的函数,但它不起作用。

    function buildResult(&$result, $parentId, $fileId, $isFolder = false)
    {
        if (count($result) > 0) {
            foreach ($result as $key => $value) {
                if (is_array($value)) {

                    if($key === $parentId && !$isFolder)
                        return $result[$parentId][] = $fileId;
                        
                    if($key === $parentId && $isFolder)
                        return $result[$parentId][] = [$fileId => []];


                    buildResult($value, $parentId, $fileId);

                }
            }
        } else {
            $result[$parentId] = [];
        }
    }

结果不必完全像我上面提到的那样。对我来说重要的是这个结果对象包含生成的唯一 ID。

我愿意接受任何建议和帮助

编辑:

我从以下结果中得到这个结果buildResult()

[
   "result" => [ "" => []]
]

标签: phpalgorithm

解决方案


推荐阅读