用函数php循环数组值

时间:2015-06-14 02:47:41

标签: php mysql arrays multidimensional-array twig

我试图使用mysql作为商店数据创建多级下拉菜单,我使用twig作为主题引擎,我知道外面有很多代码但是,所有这些HTML都作为输出,因为我使用twig,所以我需要数组作为输出,并让twig渲染它,(或者可能有其他选项,如果有,请告诉我。)
如果我使用html作为输出,此代码工作。但如果我更改为数组作为输出问题是第二菜单级别只显示1个数组或第一个数组,它不循环 这是我从mysql查询输出的数组,

Array
(
    [0] => Array
        (
            [id] => 1
            [title] => Dashboard
            [link] => 1.html
            [parent_id] => 0
        )

    [1] => Array
        (
            [id] => 2
            [title] => Master Data
            [link] => 2.html
            [parent_id] => 0
        )

    [2] => Array
        (
            [id] => 3
            [title] => submaster
            [link] => 11.html
            [parent_id] => 2
        )
    [3] => Array
        (
            [id] => 4
            [title] => submaster
            [link] => 12.html
            [parent_id] => 2
        )

这里是我试图转换的代码,我的意思是在代码html作为输出之前(ul> li> ul> li> / li> / ul> / li> / lu)

$id = '';
function sub($items, $id){
    foreach($items as $item){
        if($item['parent_id'] == $id){
            return array("link" =>$item['link'],"title"=>$item['title']);
            sub($items, $item['id']);
        }
    }
}
foreach($allmenu as $data){
    if($data['parent_id'] == 0){
        $id = $data['id'];
        $utama[]= array("link"=>$data['link'],"title"=>$data['title'],"sub"=>sub($allmenu, $id));
    }
}

这是上面代码的输出

Array
(
    [links] => Array
        (
            [0] => Array
                (
                    [link] => 1.html
                    [title] => Dashboard
                    [sub] => 
                )

            [1] => Array
                (
                    [link] => 2.html
                    [title] => Master Data
                    [sub] => Array
                        (
                            [link] => 11.html
                            [title] => Kampus
                        )

                )

        )

)

看第二个数组中的..(主数据)应该两个数组吧?链接11.html和12.html。
如果我的代码有错误让我知道,如果有链接做这个工作,请告诉我。感谢

3 个答案:

答案 0 :(得分:1)

OP的函数sub()在返回后找到第一个子元素后中断迭代。最好使用给定父$id的所有子元素构建一个数组,并在函数末尾返回此数组:

function sub($items, $id){
    $subarray = array();
    foreach($items as $item){
        if($item['parent_id'] == $id){
            $subarray[] = array(
                "link"  => $item['link'],
                "title" => $item['title'],
                "sub"   => sub($items, $item['id']),
            );
        }
    }
    return $subarray;
}

我还在子阵列的构建中集成了sub()的调用。缺点是对于函数sub()的每次调用,都会迭代孔菜单数组。在下一个版本中,这仍然可以改进。

结果如下:

Array
(
    [0] => Array
        (
            [link] => 1.html
            [title] => Dashboard
            [sub] => Array
                (
                )
        )

    [1] => Array
        (
            [link] => 2.html
            [title] => Master Data
            [sub] => Array
                (
                    [0] => Array
                        (
                            [link] => 11.html
                            [title] => submaster
                            [sub] => Array
                                (
                                )
                        )

                    [1] => Array
                        (
                            [link] => 12.html
                            [title] => submaster
                            [sub] => Array
                                (
                                )
                        )
                )
        )
)

此外还有一些进一步的改进:要删除空的子菜单数组,我要包含一个测试。参数的默认值设置为$id = 0。有了这个,就不需要为初始调用传递父ID。现在不再需要主程序中的foreach循环了。您可以直接致电sub()。使用与OP相同的变量名称,程序如下所示:

function sub($items, $id = 0){
    $subarray = array();
    foreach($items as $item){
        if($item['parent_id'] == $id) {
            $submenu = array(
                "link"  => $item['link'],
                "title" => $item['title'],
            );
            $subsubmenu = sub($items, $item['id']);
            if (!empty($subsubmenu)) {
                $submenu['sub'] = $subsubmenu;
            }
            $subarray[] = $submenu;
        }
    }
    return $subarray;
}

$utama = sub($allmenu);

有关如何将2级深度数组转换为多层深度数组的另一个示例可以在this answer中找到。

答案 1 :(得分:0)

好的,我从你的代码中改了一点。

 function sub($items, $id){
    $subarray = array();
    foreach($items as $item){
        if($item['parent_id'] == $id){
           $submenu = sub($items, $item['id']);
            if (empty($submenu)) {
            $subarray[] = array("link" => $item['link'], "title" => $item['title']);
        } else {
            $subarray[]= array("link" => $item['link'], "title" => $item['title'], "sub" => $submenu);
        }

        }
    }
    return $subarray;
}

就像$ utama中的数组一样,如果有一个sub写它,并且你的代码"sub" => sub($allmenu, $id)中有拼写错误,它应该是"sub" => sub($items, $item['id'), btw非常感谢,你救了我的命我可以创建很多嵌套菜单。

答案 2 :(得分:0)

希望这项工作

function sub($items, $id){
        foreach($items as $item){
            if($item['parent_id'] == $id){
                $sub = sub($items, $item['id']);
                if(!empty($sub))
                    return array("link" =>$item['link'],"title"=>$item['title'],"sub"=>$sub);
                return array("link" =>$item['link'],"title"=>$item['title']);
            }
        }
    }

    foreach($allmenu as $data){
        if($data['parent_id'] == 0){
            $id = $data['id'];
            $utama[]= array("link"=>$data['link'],"title"=>$data['title'],"sub"=>sub($allmenu, $id));
        }
    }