【问题标题】:automatically increment array dimension [duplicate]自动增加数组维度[重复]
【发布时间】:2019-12-19 11:13:38
【问题描述】:

我正在尝试找到一种创建目录数组的方法。但是我们都知道目录可以有很多子目录,而这些子目录可以有更多的子目录等等。 目录长度未知,因为它可以改变

假设我有一个目录www/webs/apps/pics 和另一个www/webs/test

这个想法是有一个数组,例如:(是的,下面是 json,我只是在我的 php 演示中对其进行了转换,因为我发现它更容易阅读)

{
  "www": {
     "webs": {
         "apps": {
            "pics": "Im Here"
             }
         },
       "test": "im Here too"
     }
}

上面的输出与下面的代码没有关系。下面的代码只是为了说明我需要什么。

$exploedDir = explode("/", $unsortedDir);
foreach ($exploedDir as $dir){
    $this->allDirectiroesFound[$dir] = $dir;
}

如何在不知道目录长度的情况下使$this->allDirectiroesFound 具有所需的多个维度,我无法对$this->allDirectiroesFound[][][][][][] 进行硬编码,因为下次数组长度可能是[][][]

【问题讨论】:

  • 通常,一旦您开始想要的不仅仅是“数组”,就该选择更好的数据结构了。在这种情况下,您真正​​想要的是一棵树,而不是“...的数组数组的数组”
  • 我认为我链接的问题应该为您完美解决这个问题。这是您的示例路径的工作示例:3v4l.org/PEBrL
  • @Don'tPanic 谢谢
  • @Don'tPanic 可以解释通过引用位传递吗?为什么第二个foreach 循环需要这个温度作为通过引用&$temp[$key]; 传递?谢谢
  • 通常 PHP 会按值传递所有内容。如果您在没有引用的情况下分配$temp = $temp[$key];,则$temp 只取$temp[$key],即null,因为它尚未设置为任何值。通过引用分配,$temp 指向 $temp[$key] 而不是取其值,因此您可以继续添加嵌套键。

标签: php


【解决方案1】:

您可以反转每个路径数组,然后从最后一个目录继续创建密钥。

$paths = [
    'www/webs/apps/pics',
    'www/webs/test',
];

$finalArray = [];
foreach($paths as $path){
    $revArr = array_reverse(explode("/", $path)); // This is the trick. Start to build from inside out.
    $pathArray = [];
    foreach($revArr as $key){
            $tempBucket = $pathArray;
            $pathArray = []; // Create fresh empty array to hold the 
            $pathArray[$key] = $tempBucket;
    }

    $finalArray = array_merge_recursive($pathArray, $finalArray); // Recursively Merge the array into the main array
}

echo "<pre>";
print_r(json_encode($finalArray, JSON_PRETTY_PRINT));
echo "</pre>";

DEMO

【讨论】:

  • 谢谢,这是一个很好的方法,我以前从未使用过array_reverse,所以学习它很不错:)
  • 确实如此,然后社区提出了更多最佳解决方案,这些问题与此问题重复。我刚刚在 5 分钟内将这段代码写在了脑海中 :) 我自己在这项努力中学到了一个新东西,即。 通过引用访问不存在的数组键将创建它!喜欢哇!!!我想,每个人都在这里学习新事物。
【解决方案2】:

我猜你需要使用数组来解决这个问题。

例如

var directories = ["base"];
var subdir1 = ["subdir1"];
var subsubdir1 = ["subsubdir1"];
var subsubdir1 = ["subsubdir2"];

subdir.push(subsubdir1);
subdir.push(subsubdir2);
directories.push(subdir1);

所以这形成了一个 base->subdir1->[subsubdir1, subsubdir2] 结构。复杂之处在于确保您执行的每个“推送”都是一个数组,以允许该特定子目录的相邻兄弟姐妹存在。那并跟踪目录结构

【讨论】:

    猜你喜欢
    • 2019-01-06
    • 2015-05-26
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多