【问题标题】:Full path list to array PHP数组 PHP 的完整路径列表
【发布时间】:2013-12-20 22:12:00
【问题描述】:

我从递归 glob 函数中获得了路径列表...类似于

/a/b/aaaa.txt
/c/d/bbbb.txt
/a/z/dddd.txt
/a/b/c/d/yyyy.txt

将它们放入数组的最简单方法是什么:

$a[a][b][] = aaaa.txt
$a[c][d][] = bbbb.txt
$a[a][z][] = dddd.txt
$a[a][b][c][d][] = yyyy.txt

【问题讨论】:

  • 尝试将完整路径存储在数组 $array[]=path1; $array[]=path2; $array[]=path3; $array[]=path4;
  • 我需要按照我要求的方式存储它...
  • 最简单的方法是在递归遍历目录的同时构建该数组,而不是在之后尝试将字符串拆分为数组键......
  • 任何例子都很好......
  • 希望我有正确的想法,也许这样的事情会有所帮助:stackoverflow.com/questions/952263/…

标签: php glob


【解决方案1】:

完全递归的解决方案,当我需要合并 2 个 glob 数组时使用它。所有重复项仅插入一次。

function add_path_to_array($path, $array) {
    $path = trim($path, '/');

    $exploded = explode('/',$path);
    if (count($exploded) > 1) {
        $key = $exploded[0];
        if (!isset($array[$key]))
            $array[$key] = array();
        $array[$key] = array_replace_recursive($array[$key], add_path_to_array(substr($path, strpos($path, '/')), $array[$key]));
    }
    else
        if (!in_array($path, $array))
            $array[] = $path;
    return $array;  
}
$list = array(
    '/a/b/aaaa.txt',
    '/c/d/bbbb.txt',
    '/a/z/dddd.txt',
    '/a/b/c/d/yyyy.txt',
);

$nested_array = array();

foreach($list as $path)
    $nested_array = add_path_to_array($path, $nested_array);

var_dump($nested_array);

【讨论】:

    【解决方案2】:

    如果您掌握了recursion 的概念,这听起来像是一项家庭作业测试。一旦你理解了这个概念,这类问题就很容易解决。

    $paths = array(
        '/a/b/aaaa.txt',
        '/c/d/bbbb.txt',
        '/a/z/dddd.txt',
        '/a/b/c/d/yyyy.txt',
    );
    
    $a = array();
    
    
    foreach ($paths as $path)
    {
        $newArray = buildArrayFromPath($path);
        $a = array_merge_recursive($a, $newArray);
    }
    
    /**
     * Make an array from a path string
     */
    function buildArrayFromPath($path)
    {
        $path = trim($path, '/');
        $parts = explode('/', $path);
    
        return recursiveBuildArray($parts);
    }
    
    /**
     * Recursively build a multidimensional array from path parts
     */
    function recursiveBuildArray(array $left, $new = array())
    {
        $key = array_shift($left);
    
        if (count($left) > 1) {
    
            $new[$key] = recursiveBuildArray($left, $new);
        }
        else {
            $new[$key][] = array_pop($left);
        }
    
        return $new;
    }
    
    // check if we got back the expected result
    $benchmark['a']['b'][] = 'aaaa.txt';
    $benchmark['c']['d'][] = 'bbbb.txt';
    $benchmark['a']['z'][] = 'dddd.txt';
    $benchmark['a']['b']['c']['d'][] = 'yyyy.txt';
    
    // TRUE if $a and $b have the same key/value pairs in the same order and of the same types.
    var_dump($a === $benchmark);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      • 2019-08-11
      • 2018-10-15
      • 1970-01-01
      • 2019-04-25
      • 1970-01-01
      相关资源
      最近更新 更多