Recursively PHP bir çok boyutlu dizi oluşturma

4 Cevap php

Ben ardışık bir mysql tablosundan sublevels bilinmeyen sayıda bir çok boyutlu bir dizi inşa edecek bir PHP işlevi yazmak için en iyi yolu anlamaya çalışıyorum. Onun amacı her bir menü öğesi muhtemelen çocuk menü öğeleri ile bir alt sahip bir web sitesinde bir navigasyon menüsü oluşturmak için geçirilebilir bir veri yapısı oluşturmak için.

The fields of note in the table are:
int ItemID
int ParentID
varchar ItemText
text ItemLink
tinyint HasChildren

Yani işlevinden dönen bir dizinin bir örnek olacaktır:

$menuItems = 
    array(
        itemID# => 
            array(
                'ItemText' => 'Home',
                'ItemLink' => 'index.php',
                'Children' => array(
                        itemID# => array (
                            'ItemText' => 'Home Sub 1',
                            'ItemLink' => 'somepage.php',
                            'Children' => 0
                        ),
                        itemID# => array (
                            'ItemText' => 'Home Sub 2',
                            'ItemLink' => 'somepage2.php',
                            'Children' => 0
                        ),
                    )
            ),
        itemID# => 
            array(
                'ItemText' => 'Contact',
                'ItemLink' => 'contact.php',
                'Children' => 0
            )
        )
    );

Birisi bunu gerçekleştirmek için doğru yönde bana gelin eğer çok seviniriz. Teşekkürler!

4 Cevap

Çok zor değil. Ne yapmak sen KODU onları bakabilirsiniz bir dizi menü öğeleri saklamak olduğunu. Sonra menü öğeleri üzerinde yineleme ve bir boş olmayan parentId varsa çocukların ebeveynlerinin listesine ekleyebilirsiniz. Sol yalnızca üst düzey ürün yok öyleyse o zaman ana listeden tüm çocukları çıkarın.

Kod:

<?php
$menuItems = array
(
    1 => array
    (
        'ItemText' => 'Home',
        'ItemLink' => 'index.php',
        'ParentID' => null,
    ),

    2 => array
    (
        'ItemText' => 'Home Sub 1',
        'ItemLink' => 'somepage.php',
        'ParentID' => 1,
    ),

    3 => array
    (
        'ItemText' => 'Home Sub 2',
        'ItemLink' => 'somepage2.php',
        'ParentID' => 1,
    ),

    4 => array
    (
        'ItemText' => 'Contact',
        'ItemLink' => 'contact.php',
        'ParentID' => null,
    ),
);

// Each node starts with 0 children
foreach ($menuItems as &$menuItem)
    $menuItem['Children'] = array();

// If menu item has ParentID, add it to parent's Children array    
foreach ($menuItems as $ID => &$menuItem)
{
    if ($menuItem['ParentID'] != null)
        $menuItems[$menuItem['ParentID']]['Children'][$ID] = &$menuItem;
}

// Remove children from $menuItems so only top level items remain
foreach (array_keys($menuItems) as $ID)
{
    if ($menuItems[$ID]['ParentID'] != null)
        unset($menuItems[$ID]);
}

print_r($menuItems);
?>

Çıktı:

Array
(
    [1] => Array
        (
            [ItemText] => Home
            [ItemLink] => index.php
            [ParentID] => 
            [Children] => Array
                (
                    [2] => Array
                        (
                            [ItemText] => Home Sub 1
                            [ItemLink] => somepage.php
                            [ParentID] => 1
                            [Children] => Array
                                (
                                )

                        )

                    [3] => Array
                        (
                            [ItemText] => Home Sub 2
                            [ItemLink] => somepage2.php
                            [ParentID] => 1
                            [Children] => Array
                                (
                                )

                        )

                )

        )

    [4] => Array
        (
            [ItemText] => Contact
            [ItemLink] => contact.php
            [ParentID] => 
            [Children] => Array
                (
                )

        )

)

Have a function that calls itself every time it gets an array element. As in:

Sizin fonksiyonu bir düğümü görüntülemek için denir. Onun arıyorum düğüm bir alt menüsü varsa, o zaman denetler ve eğer, tekrar kendini çağırır. Ve bunu ölene kadar işlem yinelenir ve tüm önceki fonksiyon geri dönüşü çağırır.

void printData($mysql_table_node){
    if($mysql_table_node.has_node()){
        for($i = 0; $i < $mysqql_table_node.num_nodes()){
            printData($mysql_table_node->own_node);
        }
    }
        return;
}

Ben bu geç bir cevap olduğunu biliyorum ama üzerinde bu komut dosyası bulundu ve harika oldu. Ben çünkü ben OP için benzer tasarımlı tablo ile koştu zaman ItemID, çalışıyordu şekilde benim çocuklarım unsetting da olsa bir sorun haline koştu. Bu almak için, ve web sunucularının çoğu RAM miktarı göz önüne alındığında bu işlemek gerekir, ben John Kugelman's büyük bir örnek alınır ve hafifçe modifiye ettik. Bunun yerine tüm öğeleri çocuklara uygulamak zorunda ve sonra bunları unsetting, ben yeni bir dizi oluşturmak ve bir o tüm inşa

Kod:

$new_array = array();
foreach ($menuItems as $key => &$menuItem) {
    if (($menuItem['ParentID'] != NULL) && ($menuItem['ParentID'] != '')) {
        $new_array[$menuItem['ParentID']]['Children'][$menuItem['ItemID']] = &$menuItem;
    } else {
        $new_array[$menuItem['ItemID']] = &$menuItem;
    }
}

print_r($new_array);

Yukarıdaki kesinlikle bana yardımcı oldu, çünkü bu başkası yardımcı olur umarım

Multi-dimensional tree and an unordered HTML list generator

  1. Yinelemeli olarak çok boyutlu bir diziden bir tree oluşturmak.
  2. Çok boyutlu bir HTML kodu listesi oluşturmak gelen tree (1).

You can't never know how many dimensions is in the given list of items. Each element can have a son->Grandson->Great grandson an so on.

Yani, you must use a recursive function çok boyutlu bir listesini oluşturmak için.

Here is the code:

<?php

$categories = array(
    '1'=>   array('name'=>'one','parent'=>null),
    '2'=>   array('name'=>'two','parent'=>null),
    '20'=>  array('name'=>'twenty','parent'=>'2'),
    '21'=>  array('name'=>'twenty one','parent'=>'2'),
    '210'=> array('name'=>'two hundred and ten',    'parent'=>'21'),
    '211'=> array('name'=>'two hundred and eleven', 'parent'=>'21'),
    '212'=> array('name'=>'two hundred and twelve', 'parent'=>'21')
);

$tree=Menu::CreateTree($categories);
print_r($tree);
Menu::GenerateMenuHtmlCode($tree);

class Menu
{   
    public static function GenerateMenuHtmlCode($tree)
    {
        echo '<ul>';
        foreach ($tree as $key=>$value)
        {
             echo "<li>".$value['name'];
             if(!empty($value['sons'])) 
                 self::GenerateMenuHtmlCode($value['sons']);
             echo "</li>";
        }
        echo '</ul>';
    }

    public static function CreateTree($categories)
    {
        $tree=array();
        self::AddElement(&$categories,&$tree,null);
        return $tree;
    }

    private function AddElement($categories,&$tree,$parent)
    {
        foreach ($categories as $key=>$value)
        {
            if($value['parent']==$parent)
            {
                $tree[$key]=$categories[$key];
                $tree[$key]['sons']=array();
                self::AddElement($categories,&$tree[$key]['sons'],$key);
            }
            if(empty($tree['sons'])) unset ($tree['sons']);
        }
        unset($categories[$parent]);
        return ;
    }
}
?>

The result:

Array
(
    [1] => Array
        (
            [name] => one
            [parent] => 
            [sons] => Array()
        )

    [2] => Array
        (
            [name] => two
            [parent] => 
            [sons] => Array
                (
                    [20] => Array
                        (
                            [name] => twenty
                            [parent] => 2
                            [sons] => Array()
                        )

                    [21] => Array
                        (
                            [name] => twenty one
                            [parent] => 2
                            [sons] => Array
                                (
                                    [210] => Array
                                        (
                                            [name] => two hundred and ten
                                            [parent] => 21
                                            [sons] => Array()
                                        )

                                    [211] => Array
                                        (
                                            [name] => two hundred and eleven
                                            [parent] => 21
                                            [sons] => Array()
                                        )

                                    [212] => Array
                                        (
                                            [name] => two hundred and twelve
                                            [parent] => 21
                                            [sons] => Array()
                                        )
                                )
                        )
                )
        )
)

ve:

<ul>
    <li>one</li>
    <li>two
        <ul>
            <li>twenty</li>
            <li>twenty one
                <ul>
                    <li>two hundred and ten</li>
                    <li>two hundred and eleven</li>
                    <li>two hundred and twelve</li>
                </ul>
            </li>
        </ul>
    </li>
</ul>