PHP diziler - Nasıl iç içe çok boyutlu diziye 1-boyutlu bir dizi için?

2 Cevap php

MySQL (bir kimlik sütun ve hiyerarşik ilişkileri simgeleyen bir VELİ sütun ile tablo) bir hiyerarşik yapı alınırken, ben aşağıdaki gibi bir numaralandırılmış diziye sonucu (Haritayı bu örneğin sayılar keyfi vardır):

Array ( [3] => Array ( [7] => Array () ), [7] => Array ( [8] => Array () ) )

Bildirimi 3 7 üstüdür ve 7 8 üstüdür (ve herhangi bir ebeveyn birden fazla çocuk sahibi olabilir, bu ve gidebiliriz).

Ben aşağıdaki gibi bir iç içe çok boyutlu diziye bu dizi küçültmek istedi:

Array ( [3] => Array ( [7] => Array ( [8] => Array () ) ) )

Başka bir deyişle, each NEW id is automatically assigned an empty array. Regardless, any ID's children will be pushed into their parent's array.

Daha fazla açıklama için aşağıdaki resme bir göz atın:

alt text

Bu muhtemelen beri hep have to check whether a parent with any certain ID already exists, karmaşık bir özyinelemeli çalışmasına neden (ve eğer öyleyse, onun diziye değerini itin) olacaktır.

Bana bu konuda yardımcı olabilecek bir yerleşik php işlevi var mı? Bu inşa hakkında gitmek için nasıl bir fikrin var mı? Bu değer ne için ben bu kullanıyorum (kategorileri içerebilir, alt, mesajları ... aslında bir şey) wordpress bir gezinti çubuğu inşa.

2 Cevap

Fikir bulmak tüm düğümler (ebeveyn ve çocuk) ile bir yardımcı dizi tutmak olmasıdır. Bu dizilerin değerler sonucu geri referanslar vardır.

Bu doğrusal zamanla ağacı oluşturur (array_key_exists ortalama O üzerine (1) bir karma tablo arama yapar):

//table contains (id, parent)
$orig = array(
    11 => 8,
    7 => 3,
    8 => 7,
    99 => 8,
    16 => 8,
);

$childrenTable = array();
$result = array();

foreach ($orig as $n => $p) {
    //parent was not seen before, put on root
    if (!array_key_exists($p, $childrenTable)) {
        $childrenTable[$p] = array();
        $result[$p] = &$childrenTable[$p];
    }
    //child was not seen before
    if (!array_key_exists($n, $childrenTable)) {
        $childrenTable[$n] = array();
    }

    //root node has a parent after all, relocate
    if (array_key_exists($n, $result)) {
        unset($result[$n]);
    }

    $childrenTable[$p][$n] = &$childrenTable[$n];
}
unset($childrenTable);

var_dump($result);

verir

array(1) {
  [3]=>
  array(1) {
    [7]=>
    array(1) {
      [8]=>
      array(3) {
        [11]=>
        array(0) {
        }
        [99]=>
        array(0) {
        }
        [16]=>
        array(0) {
        }
      }
    }
  }
}

EDIT: unset $childrenTable referans bayrakları temizlemek için sonunda. Uygulamada, muhtemelen yine bir işlevin içinde operasyon yapmak isteyeceksiniz.

Bu soru ve cevapları sizin için yararlı olmalıdır: turn database result into array .

@ Bill Karwin tarafından PDF sunumu, Kapatma tabloya ilişkin spesifik konuları okuyun emin olun.