如何从数组构造所有可能的路径?
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
看看 g
是 images
中的值,但也存在于数组本身中。所以我遍历 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/
)
我有这个数组:
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
看看 g
是 images
中的值,但也存在于数组本身中。所以我遍历 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/
)