PHP parentIds kullanarak çok düzeyli bir dizi oluşturma

3 Cevap php

Ben onun üst tanımlamak için parentId kullanarak, kurulum için çoklu seviyelerde olabilir listesini çalışıyorum. İlk öğenin parentId NULL. Bazı girişleri örneği:

id parentId name
1    NULL     item1
2    NULL     item2
3    1        item3
4    2        item4
5    3        item5
6    3        item6

Yani, 1 ve 2 ana öğelerdir; 3 1 bir çocuk; 4 2 çocuğu; 5 3 çocuk (1 kendisi bir çocuk olan) olduğu; 6 da 3 çocuk (1 kendisi bir çocuk olan) olduğu; vb

Ben doğru doğru seviyelere bu öğeleri ekler bir dizi oluşturma şaşırıp. Bu gibi görünmelidir:


Array
(
    [1] => Array
        (
            [name] => item1
            [parentId] => 
            [children] => Array
                (
                    [3] => Array
                        (
                            [name] => item3
                            [parentId] => 1
                            [children] => Array
                                (
                                    [5] => Array
                                        (
                                            [name] => item5
                                            [parentId] => 3
                                        )

                                    [6] => Array
                                        (
                                            [name] => item6
                                            [parentId] => 3
                                        )

                                )

                        )

                )

        )

    [2] => Array
        (
            [name] => item2
            [parentId] => 
            [children] => Array
                (
                    [4] => Array
                        (
                            [name] => item4
                            [parentId] => 2
                        )

                )

        )

)

Ama Onun parentId 3'tür. I foreach() kullanarak tüm öğelerin geçmesi ve madde 5 olsun demek, ama bu noktada, ben bu ana 3 dizide bulunan ve nasıl hiçbir fikrim yok Bu ebeveyn çocukların eklemek.

Bu öğeleri döngü için bir hile var mı, ve yerinde doğru şekilde hepsini koymak?

3 Cevap

İşte gidiyor

// your original data as an array
$data = array(
    array(
        'id' => 1,
        'parentId' => null,
        'name' => 'item1'
    ),
    array(
        'id' => 2,
        'parentId' => null,
        'name' => 'item2'
    ),
    array(
        'id' => 3,
        'parentId' => 1,
        'name' => 'item3'
    ),
    array(
        'id' => 4,
        'parentId' => 2,
        'name' => 'item4'
    ),
    array(
        'id' => 5,
        'parentId' => 3,
        'name' => 'item5'
    ),
    array(
        'id' => 6,
        'parentId' => 3,
        'name' => 'item6'
    ),
);

Recursive fonksiyon

function buildTree( $ar, $pid = null ) {
    $op = array();
    foreach( $ar as $item ) {
        if( $item['parentId'] == $pid ) {
            $op[$item['id']] = array(
                'name' => $item['name'],
                'parentId' => $item['parentId']
            );
            // using recursion
            $children =  buildTree( $ar, $item['id'] );
            if( $children ) {
                $op[$item['id']]['children'] = $children;
            }
        }
    }
    return $op;
}

print_r( buildTree( $data ) );

/*
Array
(
    [1] => Array
        (
            [name] => item1
            [parentId] => 
            [children] => Array
                (
                    [3] => Array
                        (
                            [name] => item3
                            [parentId] => 1
                            [children] => Array
                                (
                                    [5] => Array
                                        (
                                            [name] => item5
                                            [parentId] => 3
                                        )

                                    [6] => Array
                                        (
                                            [name] => item6
                                            [parentId] => 3
                                        )

                                )

                        )

                )

        )

    [2] => Array
        (
            [name] => item2
            [parentId] => 
            [children] => Array
                (
                    [4] => Array
                        (
                            [name] => item4
                            [parentId] => 2
                        )

                )

        )

)
*/

Eğer bu şekilde ebeveyn var bir öğe eklemek böylece, dizi için önemli bir değer olarak bir öğenin kimliğini kullanmalısınız:

$array[$parentID]['children'][$childID] = array();

Akla gelen ilk şey, orada ne var sadece düz bir versiyonu:

array (
[0] => array(
    'name' => 'item1',
    'parent' => null
    ),
[1] => array(
    'name' => 'item2',
    'parent' => null
    ),
[3] => array(
    'name' => 'item3',
    'parent' => 0
    ),
[4] => array(
    'name' => 'item4',
    'parent' => 3
    ),
[5] => array(
    'name' => 'item5',
    'parent' => 1
    ),
[6] => array(
    'name' => 'item6',
    'parent' => 1
    ), );

Temel olarak, sadece hiç geri ebeveyne başvuru. Tüm çocukları bulmak için, diziye döngü olurdu. Ilk kurulum süresi olsa da, oldukça hızlı olacaktır.

Akla ve gelen ikinci bir daha bir çok kurulum içerir, ancak çok daha az erişim bir süre sonra üzerinde olacaktır:

array (
[0] => array(
    'name' => 'item1',
    'parent' => null,
    'children' = array(3)
    ),
[1] => array(
    'name' => 'item2',
    'parent' => null
    'children' = array(5, 6)
    ),
[3] => array(
    'name' => 'item3',
    'parent' => 0
    'children' = array(4)
    ),
[4] => array(
    'name' => 'item4',
    'parent' => 3
    'children' = array()
    ),
[5] => array(
    'name' => 'item5',
    'parent' => 1
    'children' = array()
    ),
[6] => array(
    'name' => 'item6',
    'parent' => 1
    'children' = array()
    ), );

Bu biri olarak, ebeveyn için tüm alt dizinleri ekleme olurdum. Bu biraz daha uzun sürer, ama daha sonraki erişim süreleri hızlı olacaktır. Eğer anne sergiyi konum olarak, sadece ebeveynin çocukları diziye eklenecek.

İkinci yaklaşıma tek gerçek olumsuz bir öğe eklemek ya da kaldırmak isterseniz, geri dönün ve ebeveyn için çocukları dizi güncellemek için hatırlamak zorunda olmasıdır.