数组PHP的完整路径列表


Full path list to array PHP

我从递归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

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

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

完全递归的解决方案,当我需要合并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);