在使用递归时,如何知道在PHP中完全遍历关联数组?

时间:2014-09-12 15:42:21

标签: php arrays recursion indexing

我已经阅读了几个答案,但这对我没有意义。

这是顶级数组:

$menuData = array( 
    'items' => array(), 
    'parents' => array(),
    'link' => array()
); 

使用print_r打印时,这是该数组。

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 4
        )

    [2] => Array
        (
            [0] => 3
        )

    [4] => Array
        (
            [0] => 5
        )

    [5] => Array
        (
            [0] => 6
            [1] => 7
        )

)

我正在试图弄清楚当我完成时我是如何知道的。

我试过了

end($menuData);
$last_id = key($menuData);
echo 'LAST ' . $last_id;

它回声“链接”。我明白那个。这是最后一项。但是如果我稍后改变呢?我不想像if ($last_id == 'link')那样进行测试。这听起来不对。我不想做count++,因为我不知道如何使用递归。

在使用递归时,如何判断我位于最外层数组的末尾,并且最外层数组的子项也是完整的?我需要知道整个数组何时处理完毕。

它似乎更难,因为它是一个关联数组。

我见过其他人:

Get key of the last element in an array

这不在**recursion**的背景下。 array_walk_recursive没有帮助。这里没有看到任何内容http://php.net/manual/en/ref.array.php

不确定这个,php getting array levels in the recursion

编辑:

这是递归函数:

   // menu builder function, parentId 0 is the root 
   // I just need to know when $menuData is complete done
   // modified from some placy on the Internet I got this from
    function buildMenu($parentId, $menuData, $first=true, $submenu=0) 
    { 

        $html = ''; 

        if (isset($menuData['parents'][$parentId])) 
        { 

            if ($first)
            {
                $html = '<ul id="menu">';
            }


            foreach ($menuData['parents'][$parentId] as $itemId) 
            { 

                $menuId = $menuData['items'][$itemId]['menu_id'];
                $menuName = $menuData['items'][$itemId]['menu_name'];
                $menuDescription = $menuData['items'][$itemId]['menu_description'];
                $menuLink = $menuData['items'][$itemId]['menu_link'];
                $menuColumn = $menuData['items'][$itemId]['menu_column'];
                $menuDropdown = $menuData['items'][$itemId]['menu_dropdown'];
                if ($parentId == 0)
                {

                    $html .= '<li><a href="' . $menuLink . '" class="drop">' . $menuName  . '</a>';
                    $html .= '<div class="dropdown_' . $menuDropdown . 'column"><!-- Begin 1 columns container -->';
                    $html .= '<div class="col_' . $menuColumn . '">';
                    $html .= '<h2>';
                    $html .= ' no parent ';
                    $html .= '</h2></div></div>';

                }
                elseif ($submenu == $parentId)
                { 
                    $html .= '<div class="col_' . $menuData['items'][$itemId]['menu_column'] . '">';
                    $html .= '<h2>' . $menuData['items'][$itemId]['menu_name'] . ' SUB ' . '</h2>'; 
                    $html .= '</div>';
                }
                $previousMenuId = $menuId;

                // find childitems recursively 
                $html .= buildMenu($itemId, $menuData, false, $previousMenuId); 
                $html .= '</li>'; 
            } 
           // $html .= '</ul>'; 
        } 


        return $html; 
    } 

1 个答案:

答案 0 :(得分:0)

简单版本:

$total = count($array);
foreach($array as $element) {
    $visited++;
    if ($visited == $total) {
       .. at the last element
    }
}