多维阵列中的foreach无效



我有两种方法来研究目录和制作树。

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

最新更新