0

私のクエリは次を返します:

post_id    post_type    post_text
1          text         bla1
2          pic          bla2
3          text         bla3

この結果を次のようにループします。

$posts = array();
foreach ($query->result() as $row) {
    $post = array();
    $post['post_id']         = $row->post_id;
    $post['post_type']       = $row->post_type;
    $post['post_text']       = $row->post_text;
    $posts[] = $post;
}
$data['posts'] = $posts;

return $data;

json_encodeとコントローラーから出力すると、次のようになります。

{
    "stream": {
        "posts": [{
            "post_id": "1",
            "post_type": "text",
            "post_text": "bla1",
        },
        {
            "post_id": "2",
            "post_type": "pic",
            "post_text": "bla2",
        },
        {
            "post_id": "3",
            "post_type": "text",
            "post_text": "bla3",            
        }]
    }
}

ただし、投稿にコメントがある場合、クエリは

post_id    post_type    post_text    comment_id    comment_text
1          text         bla1         7             asd
1          text         bla1         8             sdf
2          pic          bla2
3          text         bla3         10            rty
3          text         bla3         11            yuo

このようなJSONを出力する配列を構築するためにforeachループをどのように設定する必要がありますか?

{
    "stream": {
        "posts": [{
            "post_id": "1",
            "post_type": "text",
            "post_text": "bla1",
            "comment": [{
                "comment_id": "7",
                "comment_text": "asd",
            },
            {
                "comment_id": "8",
                "comment_text": "sdf",
            }],
        },
        {
            "post_id": "2",
            "post_type": "pic",
            "post_text": "bla2",
        },
        {
            "post_id": "3",
            "post_type": "text",
            "post_text": "bla3",            
            "comment": [{
                "comment_id": "10",
                "comment_text": "rty",
            },
            {
                "comment_id": "11",
                "comment_text": "yuo",
            }],
        }]
    }
}

このJSONは、Sechaフレームワークで次のように使用されます。

                    proxy: {
                        type: 'jsonp',
                        url: 'http://myurl',
                        reader: {
                            type: 'json',
                            rootProperty: 'stream.posts'
                        }
                    }
4

3 に答える 3

2

コメントの存在について各投稿を個別にクエリすることを好みますが、ここでは 1 つのクエリを使用して配列を作成する 1 つの試みを示します。

$posts=array();
$data = array();
foreach($query->result() as $row){
  // if the post hasn't been created in the array
  // create it
  if(!isset($posts[$row['post_id']])){
    $posts[$row['post_id']] = array(
      "post_type" => $row['post_type'],
      "post_text" => $row['post_text']
    );
  }
  // if a comment is found
  if(isset($row['comment_id'])){
    $posts[$row['post_id']]['comments'][] = array(
      "comment_id" => $row['comment_id'];
      "comment_text" => $row['comment_text'];
    );
  }

}
$data['posts'] = $posts;

この配列を JSON でエンコードすると、次のようなものが作成されます...

{ "posts" :
   {
     1 : {
       "post_type" : "something",
       "post_text" : "something else"
     },
     2 : {
       "post_type" : "something",
       "post_text" : "something else",
       "comments" : [
         {"comment_id":1,"comment_text":"something"},
         {"comment_id":2,"comment_text":"something"}
       ]
     },
    ....
   }
 }

テストしていないため、このコードが完全に機能することを保証することはできませんが、それは出発点になるはずです。繰り返しますが、私があなたなら、各投稿を個別にクエリします。

于 2012-09-17T01:58:46.913 に答える
0

このコード

    foreach($query->result() as $row){
      // if the post hasn't been created in the array
      // create it
        if(!isset($post[$row->post_id])){
            $post[$row->post_id] = array(
              "post_id" => $row->post_id,
              "post_text" => $row->post_text
            );
        }
        // if a comment is found
        if(isset($row->comment_id)){
            $post[$row->post_id]['comments'][] = array(
              "comment_id" => $row->comment_id,
              "comment_text" => $row->comment_text
            );
        }
    }

    return $posts[] = array_values($post);

これを返します(必要なもの):

   [
     {
       "post_id"   : "something",
       "post_text" : "something else"
     },
     {
       "post_id"   : "something",
       "post_text" : "something else",
       "comments" : [
         {"comment_id":1,"comment_text":"something"},
         {"comment_id":2,"comment_text":"something"}
       ]
     },
    ....
   ]
于 2012-09-23T23:26:32.383 に答える
0

PHPの構文がわからないので、コードを書きません。ただし、これは PHP の問題ではなく、アルゴリズムの問​​題です。

このデータを処理するためにできることは、投稿の辞書になる中間結果を伴う 3 つのステップで行うことです。このディクショナリでは、キーは投稿 ID になり、値は投稿になります。

1/ クエリによって返された行を反復処理します。この行ごとに、この行に関連する投稿が辞書に存在するかどうかを確認します。いいえ -> 新しい投稿オブジェクトを追加します。はい -> 既存の投稿オブジェクトにコメントを追加するだけです。

2/ 辞書を反復処理して、辞書に含まれる各投稿を配列に追加します。

3/配列を投稿のIDで並べ替えます(ここでは、IDが投稿と同じ順序であると想定していますが、ちょっとしたアドバイス:おそらく投稿日を持ち、投稿日で並べ替える必要があります)。

PHP の構文をマスターすれば、簡単に実装できるはずです。このための PHP 構文を知っている場合は、遠慮なく編集を送信してください。

これが役立つことを願っています。

于 2012-09-17T01:32:05.860 に答える