1

2 つの DB テーブルがあります。表 2 は、表 1 と関係があります。

PHP では、データのキー/値を保持するために多次元配列を作成しています。

PHPには一意の「キー」が必要なため、MY JSONは次のようになります。

[
{
    "packs": {
        "9": {
            "characters": {
                "40": {
                    "id": "40",
                    "title": "Jack Bauer",
                    "pic": "68bcbe014c.jpg",
                    "gender": "Male"
                },
                "41": {
                    "id": "41",
                    "title": "Chloe O'Brian",
                    "pic": "ffb6acc8e3.jpg",
                    "gender": "Male"
                },
                "42": {
                    "id": "42",
                    "title": "Tony Almeida",
                    "pic": "23f199e223.jpg",
                    "gender": "Male"
                }
            }
        },
        "7": {
            "characters": {
                "7": {
                    "id": "7",
                    "title": "Elvis Presley",
                    "pic": "78300767ad.jpg",
                    "gender": "Male"
                },
                "16": {
                    "id": "16",
                    "title": "Madonna",
                    "pic": "70663a42f7.jpg",
                    "gender": "Male"
                },
                "17": {
                    "id": "17",
                    "title": "Lady Gaga",
                    "pic": "c5099c619b.jpg",
                    "gender": "Male"
                },
                "21": {
                    "id": "21",
                    "title": "Pink Floyd",
                    "pic": "52ddce314a.jpg",
                    "gender": "Male"
                },
                "22": {
                    "id": "22",
                    "title": "Led Zeppelin",
                    "pic": "84cd58ada3.jpg",
                    "gender": "Male"
                },
                "31": {
                    "id": "31",
                    "title": "The Beatles",
                    "pic": "bd22a4d648.jpg",
                    "gender": "Male"
                },
                "32": {
                    "id": "32",
                    "title": "Foo Fighters",
                    "pic": "250fb6ecec.jpg",
                    "gender": "Male"
                },
                "33": {
                    "id": "33",
                    "title": "Bananarama",
                    "pic": "da7c2b56cf.jpg",
                    "gender": "Male"
                },
                "35": {
                    "id": "35",
                    "title": "Boney-M",
                    "pic": "3cbdada38b.jpg",
                    "gender": "Male"
                },
                "38": {
                    "id": "38",
                    "title": "The Spice Girls",
                    "pic": "4751f0fbb7.jpeg",
                    "gender": "Male"
                },
                "39": {
                    "id": "39",
                    "title": "Girls Aloud",
                    "pic": "644dcf71ca.jpg",
                    "gender": "Male"
                }
            }
        },
        "8": {
            "characters": {
                "9": {
                    "id": "9",
                    "title": "Keith Lemon",
                    "pic": "ff6ef10853.jpg.jpg",
                    "gender": "Male"
                },
                "23": {
                    "id": "23",
                    "title": "Fearne Cotton",
                    "pic": "0d038b6516.jpg",
                    "gender": "Male"
                },
                "24": {
                    "id": "24",
                    "title": "Holly Willoughby",
                    "pic": "836fc4184c.jpg",
                    "gender": "Male"
                },
                "30": {
                    "id": "30",
                    "title": "Rufus Hound",
                    "pic": "062bee9602.jpg",
                    "gender": "Male"
                }
            }
        },
        "3": {
            "characters": {
                "5": {
                    "id": "5",
                    "title": "Tom Cruise",
                    "pic": "ff296fafb9.jpg",
                    "gender": "Male"
                },
                "10": {
                    "id": "10",
                    "title": "Linda Lovelace",
                    "pic": "ac1bea43d3.jpg",
                    "gender": "Male"
                },
                "15": {
                    "id": "15",
                    "title": "Gwyneth Paltrow",
                    "pic": "43a22d7240.jpg",
                    "gender": "Male"
                },
                "44": {
                    "id": "44",
                    "title": "Errol Flynn",
                    "pic": "cea17c1275.jpg",
                    "gender": "Male"
                },
                "45": {
                    "id": "45",
                    "title": "Halle Berry",
                    "pic": "752b5c92c5.jpg",
                    "gender": "Male"
                }
            }
        },
        "2": {
            "characters": {
                "4": {
                    "id": "4",
                    "title": "Donald Duck",
                    "pic": "8d367f41b1.jpg",
                    "gender": "Male"
                },
                "6": {
                    "id": "6",
                    "title": "Mickey Mouse",
                    "pic": "8d9629c115.jpg",
                    "gender": "Male"
                },
                "28": {
                    "id": "28",
                    "title": "Pluto",
                    "pic": "fb2c0e2dd0.jpg",
                    "gender": "Male"
                },
                "29": {
                    "id": "29",
                    "title": "Minnie Mouse",
                    "pic": "378760ff77.jpg",
                    "gender": "Male"
                },
                "36": {
                    "id": "36",
                    "title": "Cinderella",
                    "pic": "a7e4888213.jpg",
                    "gender": "Male"
                },
                "37": {
                    "id": "37",
                    "title": "Snow White",
                    "pic": "a9cf05a857.jpg",
                    "gender": "Male"
                }
            }
        },
        "4": {
            "characters": {
                "3": {
                    "id": "3",
                    "title": "Bill Clinton",
                    "pic": "03c6567ddb.jpg",
                    "gender": "Male"
                },
                "11": {
                    "id": "11",
                    "title": "Margaret Thatcher",
                    "pic": "91c9fa9fd0.jpg",
                    "gender": "Male"
                },
                "13": {
                    "id": "13",
                    "title": "David Cameron",
                    "pic": "a689984360.jpg",
                    "gender": "Male"
                },
                "14": {
                    "id": "14",
                    "title": "Nick Clegg",
                    "pic": "3243e298e5.jpg",
                    "gender": "Male"
                },
                "26": {
                    "id": "26",
                    "title": "George Bush JR",
                    "pic": "46296f6b0e.jpg",
                    "gender": "Male"
                },
                "27": {
                    "id": "27",
                    "title": "Ed Milliband",
                    "pic": "66f1449994.jpg",
                    "gender": "Male"
                }
            }
        },
        "5": {
            "characters": {
                "8": {
                    "id": "8",
                    "title": "Stephen Hawking",
                    "pic": "b8c4f17530.jpg",
                    "gender": "Male"
                },
                "18": {
                    "id": "18",
                    "title": "Alan Turing",
                    "pic": "82b4d84e35.jpg",
                    "gender": "Male"
                },
                "19": {
                    "id": "19",
                    "title": "Albert Einstein",
                    "pic": "a6cd74dbaa.jpg",
                    "gender": "Male"
                },
                "34": {
                    "id": "34",
                    "title": "Brian Cox (prof)",
                    "pic": "92b6005de9.jpg",
                    "gender": "Male"
                },
                "43": {
                    "id": "43",
                    "title": "Richard Feynman",
                    "pic": "5de10d1128.jpg",
                    "gender": "Male"
                }
            }
        },
        "6": {
            "characters": {
                "12": {
                    "id": "12",
                    "title": "Jeff Koons",
                    "pic": "8e3ca5f497.jpg",
                    "gender": "Male"
                },
                "20": {
                    "id": "20",
                    "title": "Salvador Dali",
                    "pic": "b5bafb7934.jpg",
                    "gender": "Male"
                },
                "25": {
                    "id": "25",
                    "title": "Rembrandt",
                    "pic": "73e2710029.jpg",
                    "gender": "Male"
                },
                "49": {
                    "id": "49",
                    "title": "Vincent Van Gough",
                    "pic": "6ee455ab28.jpg",
                    "gender": "Male"
                }
            }
        }
    }
}

]

私の iOS 開発者が並べ替えを必要とする問題を解決しようとしています...どうやら "{"packs":{"9": " 9 が間違っていて、key:value JSON 構造に従っていません。DB テーブル 1 の各結果セットの一意の識別子を使用して、正しい PHP 配列またはオブジェクトを作成するにはどうすればよいでしょうか?

結果は次のように構成する必要があります。

data_db_1:1

data_db_2:id data_db_2:タイトル data_db_2:pic data_db_2:性別

data_db_1:2

data_db_2:id data_db_2:タイトル data_db_2:pic data_db_2:性別

data_db_1:3

data_db_2:id data_db_2:タイトル data_db_2:pic data_db_2:性別

data_db_1:4 data_db_2:id data_db_2:タイトル data_db_2:pic data_db_2:性別

次のようになります。

     {
"id": "9",
"title": "24",
"credits": "100",
"character": [
    {
        "id": "50",
        "title": "Jack Bauer",
        "pic": "68bcbe014c.jpg",
        "gender": "Male"
    },
    {
        "id": "50",
        "title": "Jack Bauer",
        "pic": "68bcbe014c.jpg",
        "gender": "Male"
    },
    {
        "id": "50",
        "title": "Jack Bauer",
        "pic": "68bcbe014c.jpg",
        "gender": "Male"
    },
    {
        "id": "50",
        "title": "Jack Bauer",
        "pic": "68bcbe014c.jpg",
        "gender": "Male"
    }
]

}

これに関連する割り当てがウェブ上で見つかりません。それを解決するために私が考えることができる唯一の方法は、json_encode() と echo と concat の混乱を使用して、PHP 配列から個別に各部分を作成することです。確かに json_encode() は、単純な php 配列、複雑な php 多次元配列、または PHP オブジェクトから汗をかくことなく正しい JSON を作成できるはずです???


要求に応じてこれを行うための私のphp関数:

$data_ar = output_pack_data($pack_id);

echo "[".json_encode($data_ar)."]";         // first bit of dirty here

function output_pack_data($pack_id = false)
{
global $db;

$output_keys = true; //false;

if($pack_id != false)
{
    $q = "WHERE id='{$pack_id}' AND active = '1'";                                                          // select the relevant pack ID
}
else
{
    $q = "WHERE active='1' ORDER BY order_num ASC";                                                         // select all pack ids
}

$rs = $db->rs("whoami_packs",$q);

$pack_obj = new stdClass();                                                                                 // declare new std class object here......

$data = array();                                                                                            // prep new array to hold the data

while($rs && $r = $db->fetch($rs))                                                                          // loop thorugh each pack id
{
    $pack_obj->packs->id = $r->id;                                                                      // add the pack title
    $pack_obj->packs->title = $r->title;                                                                        // add the pack title
    $pack_obj->packs->credits = $r->credits;                                                                    // add the required credits to access 

    $packs_rs = $db->rs("whoami_characters","WHERE pack_id='{$r->id}' AND active = '1'");                   // get the character data relevant for this pack

    $i=0;

    while($packs_rs && $pack_r = $db->fetch($packs_rs))                                                     // loop through the character data
    {   
        $id = $r->id;

        if($output_keys == false)
        {
            $data['packs'][$r->id]['characters'][$pack_r->id][$pack_r->title][$pack_r->pic][$pack_r->gender] = true;    // build the array
        }
        else
        {
            $data['packs'][$r->id]['characters'][$pack_r->id]['id'] = $pack_r->id;                  // build the array
            $data['packs'][$r->id]['characters'][$pack_r->id]['title'] = str_out($pack_r->title);                   // build the array
            $data['packs'][$r->id]['characters'][$pack_r->id]['pic'] = $pack_r->pic;
            $data['packs'][$r->id]['characters'][$pack_r->id]['gender'] = ($pack_r->gender = 'm') ? "Male" : "Female";
        }
    }
}

return $data;                                                                                               // return the array

}

4

4 に答える 4

1

関数には余分なコードがいくつかあります。また、連続していない (数値) インデックスがある場合、json_encode は [x,y,z] エンコーディングではなくオブジェクト表記を使用します。
どうやらあなたの同僚は、オブジェクトのキーとしてではなく、各オブジェクトのプロパティとして ID を望んでいるようです。したがって、id を介して配列要素を参照するのをやめて、最初に完全な配列を作成してから、$parent[] を介してその親に追加します。このようにして、連続した数値 ID を持つ配列を取得します -> json_encode() は配列表記を作成します。
(テストされていません。元の質問で提供されたjson出力からSQLテストデータを作成するのが面倒です)

function output_pack_data($pack_id=false)
{
    global $db;
    $data = array();

    if($pack_id != false) {
        $q = "WHERE id='{$pack_id}' AND active = '1'";
    }
    else {
        $q = "WHERE active='1' ORDER BY order_num ASC";
    }

    $rs_packs = $db->rs("whoami_packs", $q);    
    while($rs_packs && ($rec_pack=$db->fetch($rs_packs)) ) {
        $pack = array(
            'id'=>$rec_pack->id,
            'title'=>$rec_pack->title,
            'credits'=>$rec_pack->credits,
            'characters'=>array()
        );

        $rs_chars = $db->rs("whoami_characters","WHERE pack_id='{$pack->id}' AND active = '1'");
        while($rs_chars && ($rec_char=$db->fetch($rs_chars)) ) {
            $pack['characters'][] = array(
                'id' => $rec_char->id,
                'title' => str_out($rec_char->title),
                'pic' => $rec_char->pic,
                'gender' => 'm'==$rec_char->gender ? "Male" : "Female"
            );
        }
        $data[] = $pack;
    }

    return $data;
}

https://en.wikipedia.org/wiki/Join_%28SQL%29http://www.w3schools.com/sql/sql_join.aspをお読みください。

于 2012-08-13T15:00:53.297 に答える
0

そのため、json_encode() は、単純なインクリメント カウンターの場合、キー値を無視するようです....

この機能:

function output_pack_data($pack_id = false)
{
global $db;

$output_keys = true; //false;

if($pack_id != false)
{
    $q = "WHERE id='{$pack_id}' AND active = '1'";                                                          // select the relevant pack ID
}
else
{
    $q = "WHERE active='1' ORDER BY order_num ASC";                                                         // select all pack ids
}

$rs = $db->rs("whoami_packs",$q);

$data = array();                                                                                            // prep new array to hold the data

$i = 0;    // AHA!

while($rs && $r = $db->fetch($rs))                                                                          // loop through each pack id
{
    $data[$i]['pack_id'] = $r->id;  
    $data[$i]['title'] = $r->title;                                                                     // add the pack title
    $data[$i]['credits'] = $r->credits;                                                                 // add the required credits to access 

    $chars_rs = $db->rs("whoami_characters","WHERE pack_id='{$r->id}' AND active = '1'");                   // get the character data relevant for this pack

    $ii = 0;           // AHA!

    while($chars_rs && $char_r = $db->fetch($chars_rs))                                                     // loop through the character data
    {   
        if($output_keys == false)
        {
            $data[$i]['characters'][$ii][$char_r->title][$char_r->pic][$char_r->gender] = true; // build the array
        }
        else
        {
            $data[(int)$i]['characters'][(int)$ii]['id'] = str_out($char_r->id);                    // build the array
            $data[(int)$i]['characters'][(int)$ii]['title'] = str_out($char_r->title);                  // build the array
            $data[(int)$i]['characters'][(int)$ii]['pic'] = $char_r->pic;
            $data[(int)$i]['characters'][(int)$ii]['gender'] = ($char_r->gender = 'm') ? "Male" : "Female";
        }
        $ii++;
    }

    $i++;
}

return $data;                                                                                               // return the array

}

目的の結果が返されます。それは奇妙で、ドキュメントには言及されていません! よし、とりあえず整理!これがこの問題を抱えている他の人の助けになることを願っています.... $i または $ii カウンターが正しい整数であることを確認するために (int) を使用することに注意してください。この場合、DB ID を使用しても機能せず、出力に追加されます。

于 2012-08-13T19:22:36.803 に答える
0

申し訳ありませんが、これはコメントであり、回答ではありません(再び)。

iOS 開発者 (私自身など) が言っていることは、キーではなく、各オブジェクトの ID を使用して各オブジェクトを定義しているということだと思います。

あなたの例と開発者が期待する出力はどちらも正しいですが、問題は情報の実際の構造です。

http://json.org/example.htmlにアクセスして、JSON データの構造化の例をいくつか確認すると、もう少し明確になるかもしれません。

これを XML で見てみましょう。次の JSON を XML に変換すると、次のようになります。

[
{
    "1": {
        "id": "1",
        "title": "Jack Bauer",
        "pic": "68bcbe014c.jpg",
        "gender": "Male"
    }
},
{
    "2": {
        "id": "2",
        "title": "Jack Bauer",
        "pic": "68bcbe014c.jpg",
        "gender": "Male"
    }
}
]

次のものが残ります。

<?xml version="1.0" encoding="UTF-8" ?>
    <1>
        <id>1</id>
        <title>Jack Bauer</title>
        <pic>68bcbe014c.jpg</pic>
        <gender>Male</gender>
    </1>
    <2>
        <id>2</id>
        <title>Jack Bauer</title>
        <pic>68bcbe014c.jpg</pic>
        <gender>Male</gender>
    </2>
</xml>

簡単に言えば、どちらの場合も正しく構造化されていますが、データの配置が正しくありません。<1> ノードと <2> ノードは同じキーである必要があります。この原則は、ほとんどの標準 (RSS など) に従います。

開発者の要件を見て、彼は次のことを望んでいます (JSON および XML の例で):

{
"character": [
    {
        "id": "1",
        "title": "Jack Bauer",
        "pic": "68bcbe014c.jpg",
        "gender": "Male"
    },
    {
        "id": "2",
        "title": "Jack Bauer",
        "pic": "68bcbe014c.jpg",
        "gender": "Male"
    }
]
}

そしてXMLとして:

<?xml version="1.0" encoding="UTF-8" ?>
<character>
    <id>1</id>
    <title>Jack Bauer</title>
    <pic>68bcbe014c.jpg</pic>
    <gender>Male</gender>
</character>
<character>
    <id>2</id>
    <title>Jack Bauer</title>
    <pic>68bcbe014c.jpg</pic>
    <gender>Male</gender>
</character>
</xml>

2 番目の例は、各値自体の id ではなく、キー (文字) が各値を定義するため、明らかにより効率的に構造化されています。

于 2012-08-13T14:39:10.137 に答える
0

オプションJSON_FORCE_OBJECT(PHP 5.3.0 以降で使用可能、こちらjson_encodeを参照)を使用すると、有効な JSON オブジェクトが強制的に作成されます。

于 2014-05-18T01:57:36.367 に答える