过滤文件路径平面数组的值以删除其他路径中包含的路径

问题描述 投票:0回答:5

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

Storage::allDirectories('/public');

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

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

我需要一种方法来删除重复的父目录,例如,如果

Images
存在或类似的东西,
Images/Proof/Another
将被删除,我只需要构建一个目录及其子文件夹的数组作为一个数组,如果这使得感觉。

例如:

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

或者类似的东西,我想不出办法让它发挥作用。

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

这是我所做的,但我认为这不会很有帮助。

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

我试图将数组分成更小的数组,并检查每个分解的位与另一个位的比较,但这让我在原地打转。

php arrays path filtering
5个回答
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
投票

如果对它进行降序排序并进行 foreach,则可以使用 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);

https://3v4l.org/0EnZ3

Preg_grep 将查找该模式并查看它是否存在于数组中。
由于我按降序循环,它会首先查看

Images/Proof/Another
,然后将其添加到列表中,因为它不在那里。
下一次迭代将查看
Images/Proof/
并且由于 preg_grep 具有模式
Images/Proof/.*
它将为 true,因此不会将其添加到列表中。
然后与图像相同。


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

不太优雅,但读起来很清晰。


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

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);
© www.soinside.com 2019 - 2024. All rights reserved.