我有两种方法来查找目录并创建树。
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
。并不是这样复制的,这没有回答我关于值为何不在数组中的问题。
答案 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);
?>