【问题标题】:php menu generator with multidimensial array具有多维数组的 php 菜单生成器
【发布时间】:2017-03-19 20:19:16
【问题描述】:

我的阵列需要帮助。几个小时试图找到解决方案,但我无法应对。我试图以这种方式来做,然而,代码证明是完全没用的。

private function findKey($array, $keySearch,$app,$klucz='')
{
    foreach ($array as $key => $item) {
        if ($key == $keySearch) {
            $c2 = [];
            $cache = [
                'nazwa'=>$app->nazwa,
                'link'=>$app->link,
                'child'=>[]
            ];

            // echo $klucz; echo '<br />';

            if($klucz && $klucz != '/'){
                // echo $klucz;
                // $k = explode('/',$klucz);
                // $url   = "/2/22/";
                // debug($klucz);
                $parts = explode('/',$klucz);
                debug($klucz);
                debug($parts);

                $x = 0;
                $last = $parts[count($parts)-1];
                $arr = array();
                while ($bottom = array_pop($parts)) {  
                    if($bottom != $last){

                        $arr = array($bottom => $arr);
                        $x++;
                    }else{
                        array_push($arr, $cache);
                    }


                }

                // $arr['child'] = $cache;
                debug($arr);
                // exit;

                // print_r($output);
                // exit;

                // self::buildKey($k);

                // print_r($c2);

                echo "<br />";
            }


        }
        else {
            $klucz = $klucz.'/'.$key;
            if (is_array($item) && self::findKey($item, $keySearch,$app,$klucz)) {
               // return true;
            }
        }
    }

    // return false;
}

我需要从循环创建数组。从 mysql 我得到数据作为对象,这个数据视图是这样的:

|id|nazwa|链接|父|

|1|abc|abcc|0|

|2|aaa|bbb|1|

|3|aas|bbc|2|

|4|asdasd|adsasd|2|

|5|asdasd|serae|4|

|6|rywer|twet|0|

现在我需要使用 mysql 中的数据的数组并将其显示在数组中,如下所示:

array(
    [1]=>array(
        id=>1,
        nazwa=>abc
        link=>abcc
        child=>array(

            [2]=>array(
                id=>2,
                nazwa=>aaa
                link=>bbb
                child=>array(

                    [3]=>array(
                        id=>3,
                        nazwa=>aas
                        link=>bbc
                        child=>array(

                        )
                    ),

                    [4]=>array(
                        id=>4,
                        nazwa=>asdasd
                        link=>adsasd
                        child=>array(

                            [5]=>array(
                                id=>5,
                                nazwa=>asdasd
                                link=>serae
                                child=>array(

                                )
                            ),
                        )
                    ),
                )
            )
        )
    ),

    [6]=>array(
        id=>6,
        nazwa=>rywer
        link=>twet
        child=>array(

        )
    ),
)

我认为只是一个简单、好的循环或函数,但我无法处理它。

【问题讨论】:

    标签: php mysql arrays multidimensional-array


    【解决方案1】:

    试试我的代码link to online demo:

    <?php
    $data = array(
        array(
            'id' => 1,
            'name' => 'abc',
            'link' => 'abcc',
            'parent' => 0
        ),
        array(
            'id' => 2,
            'name' => 'aaa',
            'link' => 'bbb',
            'parent' => 1
        ),
        array(
            'id' => 3,
            'name' => 'aas',
            'link' => 'bbc',
            'parent' => 2
        ),
        array(
            'id' => 4,
            'name' => 'asdasd',
            'link' => 'adsasd',
            'parent' => 2
        ),
        array(
            'id' => 5,
            'name' => 'asdasd',
            'link' => 'serae',
            'parent' => 4
        ),
        array(
            'id' => 6,
            'name' => 'rywer',
            'link' => 'twet',
            'parent' => 0
        )
    );
    
    function buildMenu($data) {
        usort($data, function($a, $b) {
            if ($a['parent'] == $b['parent']) {
                if ($a['id'] == $b['id']) {
                    return 0;
                }
                return ($a['id'] < $b['id']) ? -1 : 1;
            }
            return ($a['parent'] < $b['parent']) ? -1 : 1;
        });
    
        $shortcuts = array();
        $menu = array();
    
        foreach($data as &$row) {
            if ($row['parent'] <= 0) {
                $menu[] = &$row;
                $shortcuts[$row['id']] = &$row;
                continue;
            } else {
                $parent = $row['parent'];
                if (!isset($shortcuts[$parent])) {
                    throw new \Exception("Menu cannot be build");
                }
                $parentItem = &$shortcuts[$parent];
            }
            if (!isset($parentItem['child'])) {
                $parentItem['child'] = array();
            }
            $parentItem['child'][] = &$row;
            $shortcuts[$row['id']] = &$row;
        }
        return $menu;
    }
    
    print_r(buildMenu($data));
    

    它使用引用来保持干净。在 buildMenu 函数开始时,我还对您的 sorce 数组进行了排序,以便越来越多地按父 ID 对数据进行排序。

    也请考虑使用英文变量名。

    如果您想从此数组生成&lt;ul&gt; 菜单,请使用以下代码:

    $menu = '<ul>';
    function buildUl($data) {
        $menuHtml = '';
        foreach ($data as $menuItem) {
            $menuHtml .= '<li>';
            $menuHtml .= '<a href="'.$menuItem['link'].'">'.$menuItem['name'].'</a>';
            if (!empty($menuItem['child'])) {
                $menuHtml .= '<ul>';
                $menuHtml .= buildUl($menuItem['child']);
                $menuHtml .= '</ul>';
            }
            $menuHtml .= '</li>';
        }
    
        return $menuHtml;
    }
    $menu .= buildUl(buildMenu($data));
    $menu .= '</ul>';
    
    echo $menu;
    

    更新示例:http://sandbox.onlinephpfunctions.com/code/27cfa95c066be9b1526b71566e2ec2f2093bdc34

    【讨论】:

    • 谢谢它的工作,但你知道如何从这个数组生成
        • ...
      html 代码吗? :)
    • 是的,我已经用一个例子更新了我的答案。无论如何,您的菜单结构是构建嵌套菜单的最丑陋的方式。请考虑使用预排序树(俗称左右树)。
    【解决方案2】:

    当您使用对象时,事情会变得更容易:

    $data = [
        ['id' => 1, 'nazwa' => 'abc',    'link' => 'abcc',   'parent' => 0],
        ['id' => 2, 'nazwa' => 'aaa',    'link' => 'bbb',    'parent' => 1],
        ['id' => 3, 'nazwa' => 'aas',    'link' => 'bbc',    'parent' => 2],
        ['id' => 4, 'nazwa' => 'asdasd', 'link' => 'adsasd', 'parent' => 2],
        ['id' => 5, 'nazwa' => 'asdasd', 'link' => 'serae',  'parent' => 4],
        ['id' => 6, 'nazwa' => 'rywer',  'link' => 'twet',   'parent' => 0],
    
    ];
    
    $objectTree = [];
    $objects = [];
    
    foreach ($data as $row) {
        $obj = (object)$row;
        $obj->childs = [];
        $objects[$obj->id] = $obj;
    }
    
    foreach ($objects as $obj) {
        if ($obj->parent == 0) {
            $objectTree[] = $obj;
        } else {
            $objects[$obj->parent]->childs[] = $obj;
        }
    }
    
    var_export($objectTree);
    

    演示:http://rextester.com/RZRQLX19028

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-06
      • 2018-07-16
      • 2023-03-11
      • 2018-08-26
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      相关资源
      最近更新 更多