1

返される形式として XML と JSON の両方を使用する Web サイト用の API を提供しています。どちらもPHP配列から来ています。JSON の戻り値が問題の原因です。[0] や1などの代わりに同じ名前の要素を返すにはどうすればよいですか? 今、返されたのは次のようになります。

{
"rate": {
    "rate_span": "1 Minute",
    "rate_limit": "60",
    "rate_remaining": 59,
    "rate_user": "60"
},
"status": {
    "status_code": 200,
    "status_message": "Request was successful."
},
"favorites": {
    "0": {
        "favorite": {
            "lyric_id": "570"
        }
    },
    "1": {
        "favorite": {
            "lyric_id": "3530822107858532003"
        }
    },
    "2": {
        "favorite": {
            "lyric_id": "3530822107858535795"
        }
    },
    "favorites_type": "lyrics",
    "favorites_total": 3
}
}

各お気に入りを独自の「お気に入り」 { ... 要素でラップし、[0]、1、[x+1] ... でラップされている各配列をバイパスしたいと思います。この JSON 応答のように: ARTIST.ALBUMS .GET JSON

これは、お気に入り部分を構築する PHP 配列です...

$json["favorites"] = array();
$json["favorites"]["favorites_type"] = "lyrics";
$json["favorites"]["favorites_total"] = $userFavorites->recordCount();

foreach($userFavorites as $key => $fav) {
     $song_id = $fav["lyric_id"];
     $json["favorites"][]["favorite"]["lyric_id"] = $song_id;
}
4

1 に答える 1

2

JSON には、順序はあるがキーがない「配列」と、キーはあるが順序がない「オブジェクト」(ハッシュ) の 2 つの構造があります。一方、PHP はこれらを 1 つの構造に結合し、それを「配列」と呼び、キー順序の両方を持ちます。したがって、 PHP のjson_encode関数は、特定の PHP 配列に使用する JSON 構造を選択する必要があります。

データの PHP 配列$json['favourites']には、文字列キー ( など$json["favorites"]["favorites_type"]) と自動的にインクリメントされる数値キー ( を使用した場合)の両方が含まれます$json["favorites"][]。文字列キーは JSON 配列に存在できないため、PHPjson_encodeはこれを JSON オブジェクトとしてエンコードする必要があります。そのため、出力に keys "0":"1":などが表示されます (これらは、使用した場合に表示されるのと同じキーです)。print_rたとえば、アレイ上)。

その配列から文字列キーを削除すると (データを構造内の別の場所に移動すると)、数値配列だけが残ります。これは JSON 配列のようなものであるため、PHP はそのように出力し、出力にキーは表示されません。

コメントで指摘したように、各アイテムを囲む量は変更されません。要素は「同じ名前」ではなく、連想構造ではなく、順序付けられた構造に存在するだけです。

コードデモは次のとおりです。

$json["favorites"] = array();
$json["favorites"]["favorites_type"] = "lyrics";

// Simlulating entries in loop:
$json["favorites"][] = array('favourite' => array('lyric_id' => 3530822107858532003));
$json["favorites"][] = array('favourite' => array('lyric_id' => 3530822107858535795));

echo "BEFORE:";
echo json_encode($json,  JSON_PRETTY_PRINT);

// Remove the problematic string key:
unset($json["favorites"]["favorites_type"]);

echo "<br>";

echo "AFTER:";
echo json_encode($json,  JSON_PRETTY_PRINT);

出力:

BEFORE:{
    "favorites": {
        "favorites_type": "lyrics",
        "0": {
            "favourite": {
                "lyric_id": 3530822107858532003
            }
        },
        "1": {
            "favourite": {
                "lyric_id": 3530822107858535795
            }
        }
    }
}
AFTER:{
    "favorites": [
        {
            "favourite": {
                "lyric_id": 3530822107858532003
            }
        },
        {
            "favourite": {
                "lyric_id": 3530822107858535795
            }
        }
    ]
}
于 2013-11-04T04:15:29.903 に答える