在PHP中的递归函数中获取数组的父键

时间:2014-03-01 22:11:16

标签: php arrays recursion

我有这个数组:

Array
(
    [0] => index.html
    [libraries] => Array
    (
        [0] => benchmark.html
        [1] => config.html
        [database] => Array
        (
              [0] => active_record.html
              [1] => binds.html
              [hey] => Array
              (
                   [0] => test.html
              )
        )
        [2] => email.html
    )
)

这是一个表示文件夹(数组)和文件(.html)树的数组。我希望在我的页面上显示所有.html文件,其路径如下:

index.html
libraries/benchmark.html
libraries/config.html
libraries/database/active_records.html
libraries/database/binds.html
libraries/database/hey/test.html
libraries/email.html

这是我的功能,但我无法显示父键名称:

private function map_dirs($dirs) {
    $dirs_list = array();
    $i = 0;
    $keys = array_keys($dirs);
    foreach($dirs as $dir)  {
        if(is_array($dir))
            $dirs_list = array_merge($dirs_list, $this->map_dirs($dir));
        else
            $dirs_list[] = $keys[$i].'/'.$dir;
        $i++;        
    }
    return $dirs_list;
}

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

好吧,在函数中添加一个名为$ dirName的可选键,然后将current-dir-name作为新参数传递给递归部分。

像这样:

public function map_dirs($dirs, $dirName='') {
   $dirs_list = array();
   foreach($dirs as $key=>$file) {
      if(is_array($file)) {
         $dirs_list = array_merge($dirs_list, $this->map_dirs($file, $dirName.$key.'/'));
      } else {
         $dirs_list[] = $dirName.$file;
      }
   }
   return $dirs_list;
}

答案 1 :(得分:1)

从PHP 5开始,您可以使用recursiveDirectoryIterator和FileInfo对象来获取html文件的路径和exacly扩展。例如。在这种情况下,我预先使用php扩展文件进行模拟,但你可以使用html。

 function getPath($extension, $path){
     $directory = new \RecursiveDirectoryIterator($path);
     $iterator = new \RecursiveIteratorIterator($directory);
     $files = array();
     foreach ($iterator as $info) {
         $ext = $info->getExtension();
         if($ext === $extension){
             $files[$info->getBasename()] = $info->getPathname();
         }
     }
     return $files;
 }

 $array = getPath('php', __DIR__);
 echo '<pre>';
 print_r($array);
 echo '</pre>';

这是带有php扩展文件的输出:

Array
  (
     [index.php] => /var/www/system/framework/index.php
     [model_register.class.php] => /var/www/system/framework/sqls/mysql/model_register.class.php
     [model.login.php] => /var/www/system/framework/sqls/mysql/model.login.php
     [model_session.class.php] => /var/www/system/framework/sqls/mysql/model_session.class.php
     [model_logs.class.php] => /var/www/system/framework/sqls/mysql/model_logs.class.php
     [model_admin.class.php] => /var/www/system/framework/sqls/mysql/model_admin.class.php
 )