【问题标题】:Recursive function to get a multidimensional array of subdirectories递归函数获取子目录的多维数组
【发布时间】:2012-08-13 05:15:40
【问题描述】:

所以,我确实花了两天时间试图让这个想法进入我的脑海。我想要一个从脏树创建多维数组的函数。我之前手动做过,得到了这个结果:

Array ()

    [cats] = Array()
        [domestic] = Array ()
        [wild] = Array ()

    [dogs] = Array ()
        [big] = Array ()
        [small] = Array ()

    [emptyfolder]

手动我的意思是在我的函数中做这样的事情:$result['level1']['level2'] = array(); 这效果不好,因为我事先不知道污垢的深度。

该函数还使用另一个函数GetSubdirectories($directory),它返回和数组如下:

[0] = 'cats',
[1] = 'dogs'
[2] = 'emptyfolder'

所以,这里是有问题的功能:

<?php
public function GetStructure($directory, $node = 'content') //the root folder is content
    {
        if (!isset($structure))
            {
            $structure = array();
            }

        $subdirectories = $this->GetSubdirectories($directory);
        if (is_array($subdirectories))
            {
            foreach ($subdirectories as $subdirectory)
                {
                    //add new subarray
                    $structure[$node] = array();
                    //set the current path
                    $currentDirectory = $directory . "/" . $subdirectory;
                    //repeat
                    $this->GetStructure(); // <-- how to I call the function?
                }
            }
        return $structure;
        }
?>

据我了解,问题是“告诉函数将下一个数组放在哪里”。我只是不明白,任何帮助将不胜感激!

解决方案

<?php
public function PopulateArrayWithDirtree($dir, &$array = false)
    {
    $subDirs = $this->GetSubdirectories($dir);
    if (is_array($subDirs))
        {
        for ($i = 0; $i < sizeof($subDirs); $i++)
            {
            $array[$subDirs[$i]] = array();
            $this->PopulateArrayWithDirtree(($dir . "/" . $subDirs[$i]), $array[$subDirs[$i]]); //repeat
            }
        }
    return true;
    }

public function Test()
    {
    $path = $this->contentpath;
    $structure = array();
    $this->PopulateArrayWithDirtree($path, $structure);
    print_r($structure);
    }
?>

【问题讨论】:

    标签: php recursion multidimensional-array


    【解决方案1】:

    只是改变:

    $this->GetStructure(); // <-- how to I call the function?
    

    到:

    GetStructure($currentDirectory);
    

    【讨论】:

      【解决方案2】:

      听起来你想访问下一个元素?

      不要使用foreach,而是使用for 循环:

      $keys = arraykeys($subdirectories);
      $length = sizeof($keys);
      for ($i = 0; $i < $length; $i++)
      {
          $structure[$node] = array();
          $currentDirectory = $directory . "/" . $subdirectory;
          $this->GetStructure($subdirectories[$i]);
      
      }
      

      但是,如果您的意思是设置结果,那么可能就是这样。我还是一头雾水:

      $keys = arraykeys($subdirectories);
      $length = sizeof($keys);
      for ($i = 0; $i < $length; $i++)
      {
          $currentDirectory = $directory . "/" . $subdirectory;
          $structure[$node] = $this->GetStructure($subdirectories[$i]);
      }
      

      【讨论】:

      • 好吧,你让我走上了正确的道路。请参阅编辑以获取解决方案,谢谢!
      猜你喜欢
      • 2014-08-21
      • 2013-01-15
      • 2015-01-05
      • 2021-10-29
      • 2017-10-11
      • 1970-01-01
      • 2017-12-28
      • 2017-11-28
      • 2012-08-31
      相关资源
      最近更新 更多