【问题标题】:Foreach in multidimensional array doesnt work多维数组中的 Foreach 不起作用
【发布时间】:2019-02-23 10:22:01
【问题描述】:

我有两种查看目录和创建树的方法。

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。没有复制它,这并没有回答我关于为什么这些值不在数组中的问题。

【问题讨论】:

  • 你为什么想要一个数组?您应该学会使用迭代器更轻松地做事。

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


【解决方案1】:

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

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 并重复,直到计算完所有数组。

这样你就不需要知道数组的最大“深度”了。

【讨论】:

  • 我补充说,在这里我有相同的输出,非值是一个数组......你能在存储中添加新的 laravel 应用程序和几个文件夹并尝试看看我的意思吗?
  • 此外,如果您查看数组输出,您可以看到主数组项具有包含两个项的数组。因此,即使我在 foreach 中添加了 $test,它也应该返回 1,因为第一项有一个数组。
  • 你是对的,它只查看数组的第一“级别”而没有递归。
  • 重写了答案,试试这个解决方案。你的 $arr 数组应该没问题。
  • 你不明白,它在 if() 检查中失败是值一个数组。即使它是一个数组,它也会像不是一样返回
【解决方案2】:

您应该通过迭代器类来使用 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));

【讨论】:

    【解决方案3】:

    万一你什么都没有... 您可以使用相同的递归,但不需要将任何内容存储到数组中。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      • 2014-03-06
      • 1970-01-01
      • 2012-08-14
      • 2013-11-02
      • 2015-03-01
      相关资源
      最近更新 更多