改变PHP数组

改变PHP数组,php,arrays,laravel,Php,Arrays,Laravel,我需要一个目录中的所有文件夹数组,我使用laravel得到一个目录中的文件夹数组使用下面的代码 Storage::所有目录('/public') 这将返回一个如下所示的数组 $directories = [ "Gallery", "Images", "Images/Proof", "Images/Proof/Another", ]; 我需要一种方法来删除重复的父目录,例如,如果存在Images/Proof/other或类似的内容,则将删除Images,我只需要将

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

Storage::所有目录('/public')

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

$directories = [
    "Gallery",
    "Images",
    "Images/Proof",
    "Images/Proof/Another",
];
我需要一种方法来删除重复的父目录,例如,如果存在
Images/Proof/other
或类似的内容,则将删除
Images
,我只需要将目录及其子文件夹的数组构建为一个数组,如果这样做有意义的话

例如:

$directories = [
    ["Gallery"],
    ["Images/Proof/Another"],
];
或者类似的事情,我想不出一个办法来让它发挥作用

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

感谢所有的帮助


您能发布您迄今为止尝试过的代码吗

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

我试着将数组分成更小的数组,并将每个分解的位与另一个进行比较。但这让我陷入了一个循环。

如果你对它进行排序(降序)并对其进行排序,那么你可以使用preg\u 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将查找该模式,并查看它是否存在于阵列中。
由于我循环下降,它将首先查看
图像/Proof/other
,然后将其添加到列表中,因为它不在那里。
下一次迭代将查看
Images/Proof/
,由于preg\u grep具有模式
Images/Proof/*
,因此它将为真,因此不会将其添加到列表中。
然后图像也一样

如果对它进行排序(降序)并对其进行排序,则可以使用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将查找该模式,并查看它是否存在于阵列中。
由于我循环下降,它将首先查看
图像/Proof/other
,然后将其添加到列表中,因为它不在那里。
下一次迭代将查看
Images/Proof/
,由于preg\u grep具有模式
Images/Proof/*
,因此它将为真,因此不会将其添加到列表中。
然后图像也一样

像下面这样做(最简单的方法):-

输出:-

或:-

输出:-

执行以下操作(最简单的方法):-

输出:-

或:-


输出:-

您可以使用
array\u 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);

您可以使用
array\u 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;
}

快速和肮脏,但测试和工作

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

我通过删除符合逻辑的行来实现这一点

变异的,但正确地满足要求

经过测试,工作正常

检查代码段和输出

代码

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

我通过删除符合逻辑的行来实现这一点

变异的,但正确地满足要求

经过测试,工作正常

检查代码段和输出

代码

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


你能发布到目前为止你已经尝试过的代码吗?@NigelRen不知道这会有什么帮助,我一直在想做这件事的逻辑,但我已经更新了它,显示你已经尝试了一些东西,这表明你不仅仅是一个不受打扰并且乐于让别人为他们做工作的人。有些人会因为这个原因否决某个问题(在这种情况下不知道——但你可以看到它确实发生了)——我更愿意问。@NigelRen我像我说的那样仔细考虑了逻辑,想不出什么来。我没有遇到这个错误,并立即来到堆栈我一直在思考,但无法想出一些东西,所以我决定最后问。但我不知道如何表达我的想法,当我所想的一切都不起作用时,你能发布你迄今为止尝试过的代码吗?@NigelRen真的不知道这会有什么帮助,我一直在思考这样做的逻辑,但是我已经更新了它,显示你已经尝试了一些东西,这表明你不仅仅是一个不会被打扰并且乐于让别人为他们做工作的人。有些人会因为这个原因否决某个问题(在这种情况下不知道——但你可以看到它确实发生了)——我更愿意问。@NigelRen我像我说的那样仔细考虑了逻辑,想不出什么来。我没有遇到这个错误,并立即来到堆栈我一直在思考,但无法想出一些东西,所以我决定最后问。但是我不知道当我所想的一切都不起作用的时候如何表达我的想法谢谢你的回答我花了一整天的时间试图得到答案,但是我只是被安排了我的提问能力lol。我必须查一下Rsort+preg\grep,但是谢谢你这是一个很好的解决方案,我喜欢反向排序方面。然而,我真的不得不问,为什么要大写函数/控制结构的第一个字母。@请注意,这是因为我的大多数答案都写在我的手机上,它会自动大写每个新的“句子”。我还没把它学好;-)谢谢你的回答我花了整整一天的时间试图得到答案,但我只是被安排了我的提问能力lol。我必须查找Rsort+preg_grep,但谢谢你。这是一个很好的解决方案,我喜欢反向排序方面。然而,我真的不得不问,为什么要大写函数/控制结构的第一个字母。@请注意,这是因为我的大多数答案都写在我的手机上,它会自动大写每个新的“句子”。我还没把它学好;-)如果不仅零深度目录是一个重复的父目录怎么办?@shukshin.ivan OP-din不是地址,那么在第一级上存在重复的地址就没有意义了。如果不仅零深度目录是一个重复的父目录怎么办?@shuksh