0

私は、parentId フィールドによって互いに関連付けられているテーブル レコードを持っています。DB からそれらをフェッチするとき、子レコードが親オブジェクトの「子」プロパティに追加されるオブジェクトの JSON 配列を作成する必要があります。

[{
    //main object
    children : [
        {
            //#1st level children object
            children: [
                {
                    //#2nd level children object
                }
            ]
        }
    ]
},
{
(...)
]

ただし、parentId が現在のレコードと等しいレコードがない場合は、このプロパティをオブジェクトに追加しないでください。

現在、JSON 文字列を手動で作成しています。

//first get the parents
$q = 'SELECT * FROM table WHERE parentId = 0';
$r = mysql_query($q);
$x=1;
$nr = mysql_num_rows($r);
while($e = mysql_fetch_array($r)){
        if($x==1){
                echo '[ {       ';
        }
        else{
                echo ' { ';     
        }

        if($e['leaf']==1){
                $leaf = 'true'; 
        } else {
                $leaf = 'false';
        }

        echo '"EndDate" : "'.str_replace('T00:00:00','',$e['EndDate']).'",
                  "Id" : '.$e['Id'].',
                  "Name" : "'.$e['Name'].'",
                  "BaselineStartDate" : "'.str_replace('T00:00:00','',$e['BaselineStartDate']).'"';
        if($leaf){
                echo ',"leaf": '.$leaf.'';
        }

        childs($e['Id'], $x, $nr);
        if($x<$nr){
                echo ',';
        }       
        $x++;
}
if($x>1){
        echo ']';
}



function childs($id, $x, $nr, $x2='', $nr2=''){
        //now see if there are childern
        $q2 = 'SELECT * FROM table WHERE parentId = "'.$id.'" ';
        $r2 = mysql_query($q2);
        $nr2 = mysql_num_rows($r2);
        if($nr2>0){
                echo ',"children": [ '; 
                $x2 =1;
                while($e2 = mysql_fetch_array($r2)){

                        if($e2['leaf']==1){
                                $leaf2 = 'true';        
                        }
                        else{
                                $leaf2 = 'false';
                        }

                        echo '{
                              "EndDate" : "'.str_replace('T00:00:00','',$e2['EndDate']).'",
                                  "Id" : '.$e2['Id'].',
                                  "Name" : "'.$e2['Name'].'",
                                  "BaselineStartDate" : "'.str_replace('T00:00:00','',$e2['BaselineStartDate']).'",
                                  "leaf" : "'.$leaf2.'"';

                        childs($e2['Id'],$x,$nr,'',$x2,$nr2);
                        if($x2<$nr2){
                                echo ',';       
                        }
                        $x2++;

                }
                echo '] }';
        }
        else{
                echo ',"children" : []}';       
        }            
}

fetch_assoc などの組み込みの PHP 機能を使用して、このコードをより堅牢にする簡単な方法はありますか?

4

1 に答える 1

1

むしろ..

  1. データベースから結果をフェッチする
  2. 要件に従って再フォーマットします (関連するコードを変更して使用できます) PHP リレーショナル データを含む配列から多次元配列を作成します
  3. 最後に、結果の配列を json_encode します
于 2012-06-29T10:19:19.253 に答える