遍历 PHP 数组中的所有项目和子项目

Posted

技术标签:

【中文标题】遍历 PHP 数组中的所有项目和子项目【英文标题】:Iterate over all items and sub items in a PHP array 【发布时间】:2015-12-01 09:07:55 【问题描述】:

我有一个巨大的 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',
            )
        )
    )
);

我有一个文件夹结构,可以使“子子项目 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 时,都必须编辑我当前的解决方案。

【问题讨论】:

【参考方案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");

此函数为数组的每一级调用自身。递归一开始可能有点难以理解,但可以将其视为每次函数调用的新版面,每次都要遍历的数组(通过参数传入)要少一些。

【讨论】:

只有一个问题,“&”是什么意思?您已经在 $navMap 和 $nm 前面放置了一个。 没关系,这篇文章很好地解释了“&”:***.com/a/8769346/1611058【参考方案2】:

您可以使用 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 =>”构造访问它们)。

&$nm 访问实际变量而不是副本,因此您可以分配给它。

字符串插值允许您构建更具可读性的字符串,而无需使用连接。

【讨论】:

我希望能够检测当前数组中是否有 subNav 项,如果有,它可以调用一个函数,该函数建立并添加到现有的 $navMap 数组中。我期待答案会在某个地方有 array_push() 。您的解决方案稍微简洁一些,但它也有同样的问题,即无需更改代码就无法检测到第 4 或第 5 级。我正在寻找一种解决方案,它可以自行检测无限数量的关卡,而无需为每个添加的额外关卡添加额外的代码。 好的,我明白了。听起来您只是想整理现有代码。您可以通过迭代来做到这一点,但使用递归解决方案可能更简单:我将添加另一个答案。

以上是关于遍历 PHP 数组中的所有项目和子项目的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React JSX 中循环遍历数组中的某些项目 [重复]

PHP - 生成数组中的所有项目组合

如何在 PHP 中生成多个数组中的所有项目组合

如何对数组php中的所有项目运行sql查询

遍历php的_SERVER数组键值信息

遍历Firebase中节点中的所有节点