改变PHP数组

时间:2017-12-05 07:36:52

标签: php arrays laravel

我需要一个目录中所有文件夹的数组,我使用laravel使用下面的代码获取目录中的文件夹数组。

Storage::allDirectories('/public');

这将返回如下所示的数组。

$directories = [
    "Gallery",
    "Images",
    "Images/Proof",
    "Images/Proof/Another",
];

我需要一种方法来删除重复的父目录,所以例如Images将被删除如果存在Images/Proof/Another或类似的东西,我只需要构建一个目录及其子文件夹的数组一个数组,如果这是有道理的。

所以例如:

$directories = [
    ["Gallery"],
    ["Images/Proof/Another"],
];

或者像这样的事情,我想不出办法让它发挥作用。

我正在构建一个自定义媒体管理器组件,如果有人想知道,有些存在,但我无法控制它们,所以我自己建立。

所有帮助表示赞赏。

您是否可以发布到目前为止已尝试的代码

对于1我无法理解逻辑,这就是为什么我问我做了什么“我不知道它会如何帮助”

foreach (Storage::allDirectories('/public') as $folder)
{
    $all_folders[] = $exploded('/',$folder);
}

我试图将阵列分成更小的阵列并检查每个爆炸位对另一个。但这让我在圈子里奔跑。

5 个答案:

答案 0 :(得分:2)

如下所示( 最简单的方式 ): -

$final_array = [];

foreach($directories as $dir){
  $final_array[explode('/',$dir)[0]] = $dir;

}
$final_array =array_values($final_array);

输出: - https://eval.in/912417

<强> 或者: -

$final_array = [];

foreach($directories as $dir){
  $final_array[explode('/',$dir)[0]][0] = $dir;

}
$final_array =array_values($final_array);

输出: - https://eval.in/912418

答案 1 :(得分:1)

如果您对它进行过滤(降序)并预先处理它,则可以使用preg_grep查看它是否存在于新阵列中。
如果没有添加它。

com.databricks.spark.csv

https://3v4l.org/0EnZ3

Preg_grep将查找该模式并查看它是否存在于数组中 由于我循环下降,它将首先查看$directories = [ "Gallery", "Images", "Images/Proof", "Images/Proof/Another", ]; Rsort($directories); $new=[]; Foreach($directories as $val){ If(!preg_grep("~" . $val. ".*~",$new)){ $new[] = $val; } } Var_dump($new); 然后将其添加到列表中,因为它不存在。
下一次迭代将查看Images/Proof/Another,因为preg_grep具有模式Images/Proof/,所以它将为真,因此不会将其添加到列表中。
然后与图像相同。

答案 2 :(得分:1)

您只需使用array_filter函数过滤数组。

<?php
$directories = [
    "Gallery",
    "Images",
    "Images/Proof",
    "Images/Proof/Another",
];

$filtered = array_filter($directories, function($v) use ($directories) {
  foreach($directories as $dir) {
        if(strpos($dir, $v . "/") === 0) {
          return false;
        }
  }
  return true;
});
var_dump($filtered);

不那么优雅,但读起来很清楚。

答案 3 :(得分:1)

快速而肮脏,但经过测试和运作

function removeRedundantParents($directories)
{
    foreach ($directories as $key => &$val)
    {
        foreach ($directories as $i => &$v)
        {

            if ($val !== $v && substr($v, 0, strlen($val)) == $val)
            {
                unset($directories[$key]);
                continue;
            }
        }
    }

    return $directories;
}

答案 4 :(得分:1)

我通过删除行来实现这一点,如果它满足逻辑。

变异,但正确满足要求。

经过测试,工作正常。

查看https://eval.in/912439代码段和输出

<强>代码

$directories = array_flip($directories);

foreach ($directories as $dir => $key) {
  $parent_dir = preg_match('/(.*)\//', $dir, $match);
  if (isset($match[1])) {
    unset($directories[$match[1]]);
  }
}

$directories = array_keys($directories);