我有两种方法来研究目录和制作树。
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
奇怪的是,如果我在foreach
中使用echo
,它不会从上到下,而是以某种混合顺序进行。
有什么想法?
我正在尝试从Laravel存储式公共磁盘中的某个文件夹中的目录制作菜单树。
更新:我通过编写代码的这一部分在此处添加了循环中的$test
。并没有复制这样,这并没有回答我的问题,为什么值不在数组中。
在这种情况下,您需要使用"递归"。
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);
此函数检查,如果找到一个数组在其上调用自我并重复直到所有数组计数。
这样,您就不需要知道数组的最大"深度"。
您应该使用迭代器类使用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));
如果您一无所有...您可以使用相同的递归,但不需要存储任何数组。
<?php
您需要一个函数,我建议使用URL和量参数
function CountFolders($url,$amount)
{
功能获取当前文件夹中的文件和文件夹列表
$urlm=scandir($url);
循环槽
foreach($urlm as $folder)
{
检查它是否找到了目录或文件。
如果它是目录,而不是返回的链接("。"one_answers" .."),将其计算为目录数量。
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);
?>