我有一个巨大的PHP数组,它包含网站的导航结构。它基本上是这样的:
$navMap = array(
array(
'title' => 'Home',
), array(
'title' => 'about us',
'subNav' => array(
array(
'title' => 'Sub item 1',
'subNav' => array(
array(
'title' => 'Sub sub item 1',
), array (
'title' => 'Sub sub item 2',
)
),
), array (
'title' => 'Sub item 2',
), array (
'title' => 'Sub item 3',
)
)
)
);
我有一个文件夹结构,它会使“Sub sub item 2”页面链接/pages/1/0/1.php
,因为它位于第二个主要导航项目中,第一个是辅助导航项目,第二个是第三个导航项目。
我没有将链接写入容易出现人为错误的数组,而是使用PHP为我添加链接。这就是我现在正在做的事情:
for ($a = 0; $a < count($navMap); $a++) {
$navMap[$a]['link'] = '/pages/'.$a.'.php';
if (isset($navMap[$a]['subNav'])){
for ($b = 0; $b < count($navMap[$a]['subNav']); $b++) {
$navMap[$a]['subNav'][$b]['link'] = '/pages/'.$a.'/'.$b.'.php';
if (isset($navMap[$a]['subNav'][$b]['subNav'])){
for ($c = 0; $c < count($navMap[$a]['subNav'][$b]['subNav']); $c++) {
$navMap[$a]['subNav'][$b]['subNav'][$c]['link'] = '/pages/'.$a.'/'.$b.'/'.$c.'.php';
}
}
}
}
}
虽然这是一个非常难看的解决方案。有没有人知道一种更好的方法来添加链接到数组?
我正在寻找一种可以自己检测无限级别的解决方案,而不必为每增加的额外级别添加额外的代码。每次将新级别添加到$ navMap时,都必须编辑我当前的解决方案。
答案 0 :(得分:1)
你可以使用foreach循环和字符串插值:
foreach ($navMap as $a => &$nm) {
$nm['link'] = "/pages/$a.php";
if (isset ($nm['subNav'])) {
foreach ($nm['subNav'] as $b => &$sn) {
$sn['link'] = "/pages/$a/$b.php";
if (isset ($sn['subNav'])) {
foreach ($sn['subNav'] as $c => &$sn2) {
$sn2['link'] = "/pages/$a/$b/$c.php";
}
}
}
}
}
foreach在没有使用计数器的情况下进行迭代(但如果需要,您可以使用“$ a =&gt;”结构显示)。
&amp; $ nm访问实际变量而不是副本,因此您可以分配给它。
字符串插值允许您构建更易读的字符串,而无需使用连接。
答案 1 :(得分:1)
您可能想要一个递归解决方案,而不是迭代解决方案。
function build_navMap(&$navMap,$link) {
foreach ($navMap as $l => &$nm) {
$nm['link'] = "$link/$l.php";
if (isset ($nm['subNav'])) {
build_navMap($nm['subNav'],"$link/$l");
}
}
}
build_navMap($navMap,"/pages");
此函数为数组的每个级别调用自身。一开始,递归可能有点难以理解,但是将它想象成一个新的干净的平板,每个函数调用只剩下少量的数组(通过参数传递)来遍历每次。