如何从数组构造所有可能的路径?

How to construct all possible paths from an array?

我有这个数组:

Array
(
    [images] => Array
        (
            [0] => g
            [1] => hp
        )

    [g] => Array
        (
            [0] => menu
            [1] => submenu
            [2] => icons
        )

    [hp] => Array
        (
            [0] => cat
            [1] => icons
            [2] => banners
        )

    [menu] => Array
        (
            [0] => v1
        )

    [submenu] => Array
        (
            [0] => img
            [1] => icons
        )

    [icons] => Array
        (
            [0] => v1
        )

    [cat] => Array
        (
            [0] => kt
            [1] => hk
            [2] => bm
            [3] => w
            [4] => m
            [5] => at
            [6] => e
        )

    [banners] => Array
        (
            [0] => v1
        )

    [img] => Array
        (
            [0] => e
        )

    [kt] => Array
        (
            [0] => v1
        )

    [hk] => Array
        (
            [0] => v1
        )

    [bm] => Array
        (
            [0] => v1
        )

    [w] => Array
        (
            [0] => v1
        )

    [m] => Array
        (
            [0] => v1
        )

    [at] => Array
        (
            [0] => v1
        )

    [e] => Array
        (
            [0] => v1
        )

)

这里images是主文件夹。我想构建这个数组的所有可能路径,从 images 开始作为第一个子数组,如果任何值作为元素存在于数组本身中,它也是一个子文件夹,我想遍历并做同样的事情,直到我构建所有可能的路径。

所以一些可能的路径是:

images/g/menu/v1
images/g/submenu/img/e/v1

看看 gimages 中的值,但也存在于数组本身中。所以我遍历 g 并且有 menu,它再次存在于数组中。同样再次遍历 menu 的每个值,这将是 v1 并且数组中不存在。所以构建的路径将是:images/g/menu/v1.

可能有更好的方法,但这应该可以解决问题:

$myArray = [
'images' => ['g','hp'],
'g' => ['menu','submenu','icons'],
'hp' => ['cat', 'icons', 'banners'],
'menu' => ['v1',],
'submenu' => ['img','icons'],
'icons' => ['v1'],
'cat' => ['kt','hk','bm','w','m','at','e'],
'banners' => ['v1'],
'img' => ['e'],
'kt' => ['v1',],
'hk' => ['v1',],
'bm' => ['v1',],
'w' => ['v1',],
'm' => ['v1',],
'at' => ['v1',],
'e' => ['v1',],
];


function getPath($array, $key, $path, &$returnArray) {
    if(isset($array[$key]))
    {
        foreach($array[$key] as $v) {
            $newPath = $path.$v.'/';

            $nextPath = getPath($array, $v, $newPath, $returnArray);
            if(!empty($nextPath))
            {
                $returnArray[] = $nextPath;
            }
        }
    } else {
        return $path;
    }
}

$allPaths = array();

getPath($myArray, 'images', '', $allPaths);

echo "<pre>";print_r($allPaths);echo "</pre>";

输出:

Array
(
    [0] => g/menu/v1/
    [1] => g/submenu/img/e/v1/
    [2] => g/submenu/icons/v1/
    [3] => g/icons/v1/
    [4] => hp/cat/kt/v1/
    [5] => hp/cat/hk/v1/
    [6] => hp/cat/bm/v1/
    [7] => hp/cat/w/v1/
    [8] => hp/cat/m/v1/
    [9] => hp/cat/at/v1/
    [10] => hp/cat/e/v1/
    [11] => hp/icons/v1/
    [12] => hp/banners/v1/
)