9

PHP を使用して非常に大きな多次元配列を作成しています。各オブジェクトには、Name、ID、ParentID、および Children が含まれます。Children は、同じ形式の複数のオブジェクトの配列です。

各オブジェクトの ID に名前を付けることが重要です。これは、各オブジェクトを正しい親の下に配置するのに役立ちます。(以下のコードでは、101、102 などを使用しています)

ただし、私が抱えている問題は、を使用して JSON で配列を返すときですjson_encode。以下の JSON コードに示すように、各「Children」配列は、配列ではなくオブジェクトとして出力されます。

別の SO スレッドhereで読んだように、「文字列キーが含まれているため、オブジェクトとして作成されています」-数値ですが、文字列のままです。

{
"101": {
    "ID": "101",
    "ParentID": "0",
    "Name": "Root One"
    "Children": {
        "102": {
            "ID": "102",
            "ParentID": "101",
            "Name": "Child One"
        },
        "103": {
            "ID": "103",
            "ParentID": "101",
            "Name": "Child Two",
            "Children": {
                "104": {
                    "ID": "104",
                    "ParentID": "103",
                    "Name": "Child Child One"
                }
            }
        },

この問題を克服する方法を知っている人はいますか?

編集: JSON は次のようになります (角括弧は重要です!):

[
{
    "ID": "101",
    "ParentID": "0",
    "Name": "Root One",
    "Children": [
        {
            "ID": "102",
            "ParentID": "101",
            "Name": "Child One",
            "Children": [
4

4 に答える 4

6

JSON 配列には明示的なインデックスはなく、単なる順序付きリストです。名前付きキーを持つ唯一の JSON データ構造はオブジェクトです。リテラルはこれを非常に明白にするはずです:

["foo", "bar", "baz"]

この配列には名前付きインデックスがなく、追加する規定もありません。

PHP は、リストとキー値ストアの両方を 1 つのarrayデータ型にまとめます。JSON はそうではありません。

于 2013-05-07T13:23:40.557 に答える
3

これはあなたのオブジェクトです:

$parent=new StdClass();
$parent->ID=101;
$parent->ParentID=0;
$parent->Name='Root One';

$child1=new StdClass();
$child1->ID=1011;
$child1->ParentID=$parent->ID;
$child1->Name='Child One';
$parent->Children[]=$child1;


$child1_1=new StdClass();
$child1_1->ID=10111;
$child1_1->ParentID=$child1->ID;
$child1_1->Name='Child One One';
$child1->Children[]=$child1_1;    

これは JSON 変換関数です。

echo json_encode($parent,JSON_PRETTY_PRINT);

これは、JSON 形式にコード化されたオブジェクトです。

{
    "ID": 101,
    "ParentID": 0,
    "Name": "Root One",
    "Children": [
        {
            "ID": 1011,
            "ParentID": 101,
            "Name": "Child One",
            "Children": [
                {
                    "ID": 10111,
                    "ParentID": 1011,
                    "Name": "Child One One"
                }
            ]
        }
    ]
}

PHPの学習は後から始めたので、答えは後で出ました。とにかく、いつの日か、誰かがそれを役に立つと思うかもしれません。

于 2014-12-20T16:58:00.943 に答える
2

私は今、高速でうまく機能する実用的なソリューションを手に入れました。

  1. まず、質問のSOリンクに書かれているように;

    JSON では、配列には数値キーしかありませんが、オブジェクトには文字列プロパティがあります。配列キーを含めると、必然的に外部構造全体がオブジェクトになります。

    JSON で。中括弧はオブジェクト ( {}) を保持し、角括弧は配列 ( []) を保持します。

  2. そのため、文字列をキーとして使用するとjson_encode関数はオブジェクトを返しますが、キーをリセットすると配列が確実に作成されます。

  3. したがって、JSON でエンコードされた文字列を返す直前に、すべての配列キーをリセットする関数を実行します。この SO スレッド(多次元配列の配列キーのリセット) で見つけたコードは特に役に立ちました!

于 2013-05-07T14:28:04.447 に答える