多维数组中的Foreach不起作用

时间:2019-02-23 10:22:02

标签: php laravel laravel-5 multidimensional-array laravel-5.7

我有两种方法来查找目录并创建树。

public function getFolders($path)
{
    $folders = \Storage::disk('public')->directories($path);

    return count($folders) > 0 ? $folders : [];
}

public function getTree($path = '')
{
    if (count($tree = $this->getFolders($path)) === 0) {
        return ['nema'];
    }

    $arr = [];
    foreach ($tree as $value) {
        $folder = str_replace($path, '', $value);
        if (count(explode('/', $folder)) === 1) {
            if (count($this->getFolders($value)) > 0) {
                $arr[$folder] = $this->getTree($value . '/');
            } else {
                $arr[$folder] = $folder;
            }
        }
    }

    return $arr;
}

当我dd($arr)时,我得到:

array:1 [▼
  "files" => array:2 [▼
    422 => array:1 [▶]
    "shares" => array:2 [▼
      "sasic" => array:2 [▼
        "daasdasd" => "daasdasd"
        "thumbs" => "thumbs"
      ]
      "thumbs" => "thumbs"
    ]
  ]
]

但是当我尝试这样做时:

$test = 0;
foreach($arr as $folder) 
{  
    if(is_array($folder)){
        $test = $test + 1;
    }
}

return $test; // returns 0 like there is zero arrays

奇怪的是,如果我在echo中使用foreach,它不是从上到下而是以某种混合的顺序出现。

有什么想法吗?

我试图仅从Laravel存储公用磁盘中某个文件夹内的目录中创建菜单树。

更新:我在这里通过编写代码的这一部分在循环中添加了$test。并不是这样复制的,这没有回答我关于值为何不在数组中的问题。

3 个答案:

答案 0 :(得分:2)

在这种情况下,您需要使用“递归”。

function CountFolders($folder_array,$amount)
{
    foreach($folder_array as $folder)
    {
        if(is_array($folder))
        {
            $amount = $amount + 1;
            $amount=CountFolders($folder,$amount);

        }
    }
    return $amount;
}

echo'Total folders: '.CountFolders($arr,0);

此函数检查是否找到一个数组,对它调用SELF,然后重复进行直到所有数组都计数。

这样,您无需知道数组的最大“深度”。

答案 1 :(得分:1)

您应该通过迭代器类使用PHP的OOP方法:

class DirectoryArrayTreeIterator extends RecursiveDirectoryIterator
{
  function current()
  {
    return ($this->isDir()) ? iterator_to_array($this->getChildren()) : $this->getFilename();
  }
}

$iter = new DirectoryArrayTreeIterator('/path/to/folder', DirectoryArrayTreeIterator::SKIP_DOTS | DirectoryArrayTreeIterator::KEY_AS_FILENAME);
var_dump(iterator_to_array($iter));

答案 2 :(得分:0)

如果你什么都没有... 您可以使用相同的递归,但是不需要存储任何要存储的数组。

<?php

您需要一个函数,我建议使用URL和AMOUNT参数

function CountFolders($url,$amount)
{

该功能获取当前文件夹中文件和文件夹的列表

$urlm=scandir($url);    

环形槽

foreach($urlm as $folder)
{

检查是否找到目录或文件。

如果它是目录,而不是要返回的链接(“。”和“ ..”),则将其计入目录数量。

if((is_dir($url.'/'.$folder))&&($folder!='.')&&($folder!='..'))
{
    $amount = $amount + 1;

可选,以显示找到的目录列表。

如果需要,您可以在此处存储目录名称或URL到阵列。

//echo $url.'/'.$folder.' - <strong>DIR</strong><hr>';

如果是目录,请在其中检查其他目录

        $amount=CountFolders($url.'/'.$folder,$amount);
    }
  }

函数返回目录中目录的数量。

  return $amount;
}

最后显示结果

echo'Total directories: '.CountFolders('../TestFolder',0);
?>

所有代码都放在一个地方:

<?php

function CountFolders($url,$amount)
{
    $urlm=scandir($url);    
    foreach($urlm as $folder)
    {
        if((is_dir($url.'/'.$folder))&&($folder!='.')&&($folder!='..'))
        {
            $amount = $amount + 1;

            echo $url.'/'.$folder.' - <strong>DIR</strong><hr>';

            $amount=CountFolders($url.'/'.$folder,$amount);
        }
    }
    return $amount;
}

echo'Total folders: '.CountFolders('../TestFolder',0);

?>