Nasıl php dizide, bir db tablodan bir hiyerarşik yapısı php almak için, ya da JSON [yinelenen]

2 Cevap php

Possible Duplicate:
Turn database result into array

Merhaba çocuklar, lütfen bana yardımcı olabilir. Php dizi veya JSON, bir db tablodan bir hiyerarşik yapısı php almak nasıl, ancak aşağıdaki biçimde:

[{"Nitelikler": {"id": "111"}, "data": "Bazı düğümü title", "çocuk": [{"nitelikler": {"id": "555"}, "data": "Burada bir alt düğümü title"}], "devlet": "açık"}, {"nitelikler": {"id": "222"}, "data": "Diğer ana düğüm", "çocuk": [{ "nitelikler": {"id": "666"}, "data": "Başka bir alt düğüm"}], "devlet": "açık"}]

ID, ANA, SİPARİŞ, ADI: My SQL tablo alanları içeren

Bana bu konuda yardım edebilir misiniz? Bunu almak için çalışıyorum deli gidiyorum.

Many thanks in advance. Daniel

2 Cevap

İki geçişli foreach hile yok. Bu yinelemeli ebeveynleri tüm çocuk bağlanacaktır.

$structure = array();
foreach( $array as $row ) { //add rows to array by id
    $structure[ $row["id"] ] = $row + array( "children" => array() );
}
foreach( $structure as &$row ) { //link children to parents
    if( ! is_null( $row["parent"] ) ) {
        $structure[ $row["parent"] ]["children"][] =& $row;    
    }
}

Eğer veri depolama kullandığınız yöntem komşuluk Listesi modeli denir. Ne gerek elde edebilmek için. Bu adımları izleyin.

1) ana unsurları almak ve bir dizi / karma kaydedin.

2) Iterate through the parent array and retrieve child elements using the id of the parent. Save the result to an array and append as element of the current parent array using "children" as key.

3) JSON çıkan dizi kodlamak.

<?php
    $sql    = "SELECT * FROM yourtable WHERE PARENT is NULL or PARENT = 0";
    $result = $db->query($sql);  //a valid MySQL database adapter with a 
                                 //"query" method which returns the full result set.
    $arr = array();
    foreach($result as $row) {
       $sql = "SELECT * FROM yourtable WHERE PARENT = {$row['id']}";
       $result2 = $db->query($sql);
       $row["children"] = $result2;
       $arr[] = $row;
    }
    echo json_encode($arr);
?>

Tablonun bu tür veri hiyerarşisi alma hakkında daha fazla bilgi için, Retrieving Data Hierarchies on a SQL Table üzerine Rum adlı yazıyı okuyun.

Ayrıca, bu uygulamada önlem almak. Bunu uygulamak kolay görünüyor olsa da, bu durumda veritabanı sunucusu olarak, dış kaynak çağrı içeren yineleme sayısına dikkat. Yinelemeli sorgular çağırarak bu gelecekte performans sorunlarına neden dışarı bok atıyor. Bu durumda (o by-ref $ satırda çağrı kullanılan neden emin değilim gerçi), Kendall Hopkins benzer bir tekniği uygulayabilirsiniz. Hakkında daha fazla bilgi iterative external resource calls here.

<?php
$sql = "SELECT * FROM yourtable";
$result = $db->query($sql);
$arr = array();
//re-index the result array based on their actual IDs
foreach ($result as $row) {
    $arr[$row['ID']] = $row;
}
foreach ($arr as $item) {
    if (!empty($item["PARENT"]) && $item["PARENT"] != 0) {
       $arr[$item["PARENT"]]["children"][] = $item;
       //unset the discovered child item to clean-up array and release memory allocation 
       unset($arr[$item["ID"]]);
    }
}
echo json_encode($arr);
?>