【问题标题】:PHP multidimensional array recursion problem [duplicate]PHP多维数组递归问题[重复]
【发布时间】:2011-11-27 05:40:39
【问题描述】:

可能重复:
Walk array recursively and print the path of the walk

任何人都可以在此代码上帮助我吗?

<?php
function buildMenuWalk(&$array, &$depth, $currentDepth = 1)
    {
        # start new level html
        $html = '';

        # walk till the depth defined on the config
        if($currentDepth > $depth)
        {
            return null;
        }

        # loop through all items in this level
        foreach($array as $key => &$value)
        {       
            # if not in area map continue
            if(!is_numeric($key))
            {
                continue;
            }

            # if no <li> has been created yet, open the <ul>
            $html .= empty( $html ) ? '<ul class="dropdown">' : ''; 

            #extract the label from this level's array, designated by $labelKey
            $label = isset( $value['areaname'] ) ? $value['areaname'] : '';

            # open an <li>
            $html .= '<li>';

            # generate url
            $url = '';
            if($currentDepth == $depth)
            {
                $url = ' href="'.

                $url .= '"';
            }

            # construct content inside the <li>
            $html .= '<a' . $url .'>' . $label . '</a>';


            # run the function again to grab children levels
            if(is_array($value))
            {
                $html .= buildMenuWalk($value, $depth, $currentDepth + 1);
            }

            # close <li>
            $html .= '</li>';
        }

        # close <ul> if was generated content on this level
        $html .= !empty( $html ) ? '</ul>' : '';

        return $html;
    }
$depth = 2;

$config['content']['map'][1]['areaname'] = 'area_1';
$config['content']['map'][1][1]['areaname'] = 'block_1';
$config['content']['map'][2]['areaname'] = 'area_2';
$config['content']['map'][2][1]['areaname'] = 'block_1';
$config['content']['map'][2][2]['areaname'] = 'bloack_2';

echo buildMenuWalk($config['content']['map'], $depth);
?>

如果您检查上面的代码,我会使用递归方式显示菜单...

如果脚本识别菜单到达深度,将在标签内显示href=""。在这个 href 中,我想在递归中添加所有父区域。

例如:

$config['content']['map'][2]['areaname'] = 'area_2';
$config['content']['map'][2][1]['areaname'] = 'block_1';
$config['content']['map'][2][2]['areaname'] = 'bloack_2';

当脚本到达block_2时,我需要显示:

<a href="area_2=2&block_2=2">

由于它是一个多维数组并且可以增长到 4-5 维,因此输出 href 应该计算所有这些级别。例如 area_2=1&block_10=5&sub_area_1=5&section_7=8 ...

我可能需要一些数组来存储递归期间的所有 href 路径,但我不知道该怎么做。

谢谢,

PS:脚本将用于构建下拉菜单。父级别不需要链接,因此打印标签将显示子菜单。最后一个孩子,将被链接,但需要包含所有父参数,以便过滤结果。

链接到运行和返回值的代码: http://codepad.org/iyrcdfQP

【问题讨论】:

    标签: php arrays recursion multidimensional-array


    【解决方案1】:

    由于此函数递归调用自身,您必须引用一个全局变量来跟踪前一棵树。所以这里的代码会做我认为你想要它做的事情。你们都需要改变的是#generate url 部分。

    # generate url
    $url = '';
    if($currentDepth == $depth) {
      $url = " href=area=" . $GLOBALS['area'] . "&block=$key";
    } else {
      $GLOBALS['area'] = $key;
    }
    

    【讨论】:

    • 我会在下面发布另一个版本。
    • 谢谢你,克里斯,但是在那个代码上,我可以有比 2 更大的维度。所以,我需要一个代码来检查 currentDepth = depth 并打印当前元素的所有路径。所以,如果我的数组有 5 维深度,它应该打印在 $url 上。 dimension1=keydimension1&dimension2=keydimension2&dimension3=keydimension3 以此类推...
    【解决方案2】:

    我不明白为什么人们会在一个二维世界中为递归和多个维度而烦恼,就像网页中的菜单一样!

    我只会选择二维,第一个维度是保留所有元素(没有任何标准),第二个维度是保留有关元素的信息:

    自己检查一个示例,您设置要获取函数的元素以及之前级别的所有祖先和根元素(就像加利福尼亚一样)。

    <?php
    function buildMenuWalk($element,$menuElements)
    {
        for($i=0;$i<=$element;$i++)
        {
            //for a new level go to the next line
            if(!isset($menuElements[$i]['ancestors']))
            {
                echo '<br>______________________________________</br>';
                echo '<strong>',$menuElements[$i]['label'],'</strong> | ';
            }
            //if the element is reached display it along with ancestors
            if($i==$element)
            {
                //echo all the ancestores
                foreach($menuElements[$element]['ancestors'] as $value)
                { 
                    echo $menuElements[$value]['label'],' | ';
                }
                //display the element itself
                    echo '<font color=red>',$menuElements[$element]['label'],' | </font>';          
            } 
        }
    }
    
    //California
    $menuElements[0]=Array('url'=>'http://www.California.com','label'=>'California');
    $menuElements[1]=Array('url'=>'http://www.San Diego.com','label'=>'San Diego','ancestors'=>Array(0));
    $menuElements[2]=Array('url'=>'http://www.San Jose.com','label'=>'San Jose','ancestors'=>Array(0,1));
    $menuElements[3]=Array('url'=>'http://www.San Francisco.com','label'=>'San Francisco','ancestors'=>Array(0,1,2));
    $menuElements[4]=Array('url'=>'http://www.Fresno.com','label'=>'San Francisco','ancestors'=>Array(0,1,2,3));
    $menuElements[5]=Array('url'=>'http://www.Sacramento.com','label'=>'Sacramento','ancestors'=>Array(0,1,2,3,4));
    
    //Wyoming
    $menuElements[6]=Array('url'=>'http://www.Wyoming.com','label'=>'Wyoming');
    $menuElements[7]=Array('url'=>'http://www.Cheyenne.com','label'=>'Cheyenne','ancestors'=>Array(6));
    $menuElements[8]=Array('url'=>'http://www.Casper.com','label'=>'Casper','ancestors'=>Array(6,7));
    $menuElements[9]=Array('url'=>'http://www.Laramie.com','label'=>'Laramie','ancestors'=>Array(6,7,8));
    $menuElements[10]=Array('url'=>'http://www.Gillette.com','label'=>'Gillette','ancestors'=>Array(6,7,8,9));
    $menuElements[11]=Array('url'=>'http://www.Rock Springs.com','label'=>'Rock Springs','ancestors'=>Array(6,7,8,9,10));
    
     echo '<pre>'; 
     buildMenuWalk(9,$menuElements);
    
    ?>
    

    【讨论】:

    • 这不是真正的问题,您创建了一个返回单个菜单的函数,而我需要一个用于多维下拉菜单的函数。
    【解决方案3】:

    这是对同一段代码的修改,它使 href= 更像您所描述的内容,尽管它对我来说并没有真正意义。

        # generate url
        $url = '';
        if($currentDepth == $depth) {
          $url = " href=".$GLOBALS['area_name']."=".$GLOBALS['area']."&$label=$key";
        }
        else {
          $GLOBALS['area'] = $key;
          $GLOBALS['area_name'] = $label;
        }
    

    【讨论】:

    • Henrique,这段代码能解决问题吗?
    猜你喜欢
    • 2017-02-26
    • 1970-01-01
    • 2011-11-21
    • 2020-03-21
    • 2014-10-31
    • 2020-04-28
    • 2013-11-11
    • 1970-01-01
    • 2017-12-28
    相关资源
    最近更新 更多