1

重複の可能性:
データベースの結果を配列に変換する

こんにちは、私を助けてください。php 配列または JSON で、db テーブルから階層的な php 構造を取得する方法を次の形式で示します。

[
  {
     "attributes":{
        "id":"111"
     },
     "data":"Some node title",
     "children":[
        {
           "attributes":{
              "id":"555"
           },
           "data":"A sub node title here"
        }
     ],
     "state":"open"
  },
  {
     "attributes":{
        "id":"222"
     },
     "data":"Other main node",
     "children":[
        {
           "attributes":{
              "id":"666"
           },
           "data":"Another sub node"
        }
     ],
     "state":"open"
  }
]

私の SQL テーブルにはフィールドが含まれています: ID、PARENT、ORDER、TITLE

これで私を助けてもらえますか?私はこれを手に入れようとして夢中になっています。

よろしくお願いします。ダニエル

4

2 に答える 2

2

2 パスの foreach でうまくいきます。これにより、すべての子が親に再帰的にリンクされます。

$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;    
    }
}
于 2010-05-10T03:12:17.160 に答える
0

データの保存に使用している方法は、隣接リスト モデルと呼ばれます。あなたが必要とするものを達成できるように。次の手順を実行します。

1) 親要素を取得し、配列/ハッシュに保存します。

2) 親配列を反復処理し、親の ID を使用して子要素を取得します。結果を配列に保存し、「子」をキーとして現在の親配列の要素として追加します。

3) 結果の配列を JSON エンコードします。

<?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);
?>

これらのタイプのテーブルでデータ階層を取得する方法の詳細については、SQL テーブルでのデータ階層の取得に関する Rum の投稿を参照してください。

また、この実装では注意してください。実装は簡単に見えますが、外部リソース (この場合はデータベース サーバー) の呼び出しを伴う反復回数に注意してください。クエリを繰り返し呼び出すと、将来的にパフォーマンスの問題が発生する可能性があります。その場合は、Kendall Hopkins と同様の手法を適用できます (ただし、彼が $row で by-ref 呼び出しを使用した理由はわかりません)。反復的な外部リソース呼び出しの詳細については、こちら を参照してください。

<?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);
?> 
于 2010-05-10T03:22:28.407 に答える