我需要目录中所有文件夹的数组,我使用 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);
}
我试图将数组分成更小的数组,并检查每个分解的位与另一个位的比较,但这让我在原地打转。
像下面这样(最简单的方法):-
$final_array = [];
foreach($directories as $dir){
$final_array[explode('/',$dir)[0]] = $dir;
}
$final_array =array_values($final_array);
或者:-
$final_array = [];
foreach($directories as $dir){
$final_array[explode('/',$dir)[0]][0] = $dir;
}
$final_array =array_values($final_array);
如果对它进行降序排序并进行 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);
Preg_grep 将查找该模式并查看它是否存在于数组中。
由于我按降序循环,它会首先查看
Images/Proof/Another
,然后将其添加到列表中,因为它不在那里。Images/Proof/
并且由于 preg_grep 具有模式 Images/Proof/.*
它将为 true,因此不会将其添加到列表中。您可以使用
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);
不太优雅,但读起来很清晰。
快速和肮脏,但经过测试并且有效
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;
}
我通过删除满足逻辑的行来实现这一点。
有变异,但正确满足要求。
已测试,工作正常。
查看 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);