我需要一个目录中所有文件夹的数组,我使用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);
}
我试图将阵列分成更小的阵列并检查每个爆炸位对另一个。但这让我在圈子里奔跑。
答案 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
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);