【问题标题】:Displaying adjacency list array using PHP使用 PHP 显示邻接列表数组
【发布时间】:2014-09-23 14:39:50
【问题描述】:

我有以下数组需要显示为导航

[items] => Array
        (
            [Electronics] => Array
                (
                    [level2] => Array
                        (
                            [Home Use] => Array
                                (
                                    [level3] => Array
                                        (
                                            [Laptops] => Array
                                                (
                                                    [level4] => Array
                                                        (
                                                            [0] => HP A very simple laptop
                                                            [1] => HP Tablet 
                                                            [2] => Acer Laptop 
                                                        )

                                                )

                                            [Desktops] => Array
                                                (
                                                    [level4] => Array
                                                        (
                                                            [0] => Acer Tablet 
                                                        )

                                                )

                                            [Tablets] => Array
                                                (
                                                    [level4] => Array
                                                        (
                                                            [0] =>  
                                                        )

                                                )

                                        )

                                )

                            [Business] => Array
                                (
                                    [level3] => Array
                                        (
                                            [Tablets] => Array
                                                (
                                                    [level4] => Array
                                                        (
                                                            [0] => HP A very simple laptop
                                                            [1] => HP Tablet 
                                                            [2] => Touchmate 
                                                        )

                                                )

                                            [Laptops] => Array
                                                (
                                                    [level4] => Array
                                                        (
                                                            [0] => Compaq 
                                                            [1] => IBM 
                                                        )

                                                )

                                            [Desktop] => Array
                                                (
                                                    [level4] => Array
                                                        (
                                                            [0] => Lenovo 
                                                        )

                                                )

                                        )

                                )

                        )

                )

            [Hotels] => Array
                (
                    [level2] => Array
                        (
                            [5 Stars] => Array
                                (
                                    [level3] => Array
                                        (
                                            [Daily Basis] => Array
                                                (
                                                    [level4] => Array
                                                        (
                                                            [0] => Hilton 
                                                        )

                                                )

                                            [Montly Basis] => Array
                                                (
                                                    [level4] => Array
                                                        (
                                                            [0] => Hilton 
                                                            [1] => Intercon 
                                                            [2] => Marina Hotel 
                                                            [3] => Galaxy Plaza Hotel 
                                                        )

                                                )

                                        )

                                )

                            [4 Stars] => Array
                                (
                                    [level3] => Array
                                        (
                                            [Daily Basis] => Array
                                                (
                                                    [level4] => Array
                                                        (
                                                            [0] => Address 
                                                        )

                                                )

                                            [Montly Basis] => Array
                                                (
                                                    [level4] => Array
                                                        (
                                                            [0] => Armada Al Barsha Hotel 
                                                            [1] => Everest International Hotel 
                                                            [2] => New Hotel 
                                                            [3] => Good Hotel 
                                                        )

                                                )

                                        )

                                )

                            [3 Stars] => Array
                                (
                                    [level3] => Array
                                        (
                                            [Daily Basis] => Array
                                                (
                                                    [level4] => Array
                                                        (
                                                            [0] => Royal Garden Hotel 
                                                        )

                                                )

                                            [Montly Basis] => Array
                                                (
                                                    [level4] => Array
                                                        (
                                                            [0] => Galaxy Plaza Hotel 
                                                        )

                                                )

                                        )

                                )

                        )

                )

            [Entertainment] => Array
                (
                    [level2] => Array
                        (
                            [] => Array
                                (
                                    [level3] => Array
                                        (
                                            [] => Array
                                                (
                                                    [level4] => Array
                                                        (
                                                            [0] =>  
                                                        )

                                                )

                                        )

                                )

                        )

                )

            [Services] => Array
                (
                    [level2] => Array
                        (
                            [] => Array
                                (
                                    [level3] => Array
                                        (
                                            [] => Array
                                                (
                                                    [level4] => Array
                                                        (
                                                            [0] =>  
                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

)

现在...我想在无序列表中显示它。我有以下功能。

public function display($sorted_array)
{   


    $markup = '';

    foreach ($sorted_array as $key => $value) 
    {   

        if($key === 'Electronics' || $key ==='Hotels' || $key === 'Services' || $key === 'Entertainment')
        {
            $markup .= '<h1><li>';
        }

        $markup .= (is_array($value)) ? '<b>'.$key.'</b></li></ul></h1>'.$this->display($value) : '<ul><li>'.$value. '</li></ul>';

    }

    return '<ul>'.$markup . '</ul>';

}

Electronics

Home Use

Laptops

    HP A very simple laptop
    HP Tablet 
    Acer Laptop 

台式机

    Acer Tablet 

平板电脑

商业

Tablets

    HP A very simple laptop
    HP Tablet 
    Touchmate 

笔记本电脑

    Compaq 
    IBM 

桌面

    Lenovo 

酒店

5 Stars

Daily Basis

    Hilton 

所有类别和子类别都以正确的顺序显示。但是,我需要知道我应该在哪里添加一个 id,以便我可以将样式添加到子类别并适当地放置它们。

【问题讨论】:

    标签: php arrays recursion adjacency-list


    【解决方案1】:

    如果你使用 id,那么你会多次使用一个 id,所以使用 class 而不是 id。一种方法是保留一个代表级别的计数器。根据你的功能正常工作,你会得到这样的:

    public function strip($string)
    {
        $string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens.
        $string = preg_replace('/[^A-Za-z0-9\-]/', '', $string); // Removes special chars.
        $string = strtolower($string); //To lower case  
        return $string;
    }
    
    public function display($sorted_array, $level=0)
    {   
        $level++;
    
        $markup = '';
    
        foreach ($sorted_array as $key => $value) 
        {   
    
            if($key === 'Electronics' || $key ==='Hotels' || $key === 'Services' || $key === 'Entertainment')
            {
                $markup .= '<h1><li id="'.$this->strip($key).'" class="level-'.$level.'">';
            }
    
            $markup .= (is_array($value)) ? '<b>'.$key.'</b></li></ul></h1>'.$this->display($value,$level) : '<ul><li id="'.$this->strip($key).'" class="level-'.$level.'">'.$value. '</li></ul>';
    
        }
    
        return '<ul>'.$markup . '</ul>';
    }
    

    现在您可以在 CSS 中使用关卡类。

    .level-1 {
    
    }
    .level-2 {
    
    }
    ...
    

    【讨论】:

    • 我试过了,但是它将 level1 分配给所有叶节点(最后一个没有子节点的节点)。这是一个递归函数。如果当前键是一个数组,则打印键的名称并将数组再次传递给同一个函数,这样当当前键是一个值时,它就会被打印。问题是在一次迭代中,值是print 可以是任何东西;父节点、子节点、子子节点、子子子节点或前导节点。如何知道现在的等级?
    • 因此,在一次迭代中,会打印 KEY 或 VALUE。阵列井井有条,并以正确的顺序完美打印。我想要的只是设置适当的 id,以便我可以将它们设置为类别和子类别的标准导航。
    • 那个级别的东西应该可以工作。因为您的函数是迭代的,所以当您第二次调用该函数时它会增加。我编辑了我的问题。现在每个li 项目都有一个ID。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    相关资源
    最近更新 更多