json_encodeスパースPHP配列をJSONオブジェクトとしてではなくJSON配列として


119

PHPには次の配列があります。

Array
(
    [0] => Array
        (
            [id] => 0
            [name] => name1
            [short_name] => n1
        )

    [2] => Array
        (
            [id] => 2
            [name] => name2
            [short_name] => n2
        )
)

JSON配列としてJSONエンコードして、次のような文字列を生成します。

[  
    {  
        "id":0,
        "name":"name1",
        "short_name":"n1"
    },
    {  
        "id":2,
        "name":"name2",
        "short_name":"n2"
    }
]

しかし、json_encodeこの配列を呼び出すと、次のようになります。

{  
    "0":{  
        "id":0,
        "name":"name1",
        "short_name":"n1"
    },
    "2":{  
        "id":2,
        "name":"name2",
        "short_name":"n2"
    }
}

これは配列ではなくオブジェクトです。

json_encode代わりに、配列を配列としてエンコードするにはどうすればよいですか?

回答:


194

配列がシーケンシャルではないため、この動作を観察しています。キー02はあります1が、キーとしてはありません。

数値のインデックスを持つだけでは十分ではありません。json_encodePHP配列がシーケンシャルである場合、つまり、そのキーが0、1、2、3、...である場合にのみ、PHP配列をJSON配列としてエンコードします

array_values関数を使用して配列のインデックスを順次再作成し、必要な動作を取得できます。たとえば、以下のコードはユースケースで正常に機能します。

echo json_encode(array_values($input)).

4
しかし、キー0,2が重要な場合はどうなりますか?同じ状況で、配列のインデックスを再作成できません。
shyammakwana.me

2
JSONは連想配列をサポートしていません。参照:tools.ietf.org/html/rfc7159#section-5
Nguyen Van Vinh

74

ArrayJSONインデックス付きの配列ですだけあなたが取得しようとしている構造が有効なJSON / Javascriptのではありませんので、。

PHPの連想配列はJSONのオブジェクトであるため、インデックスが必要でない限り、このような変換はできません。

このような構造を取得したい場合は、次のようにすることができます。

$indexedOnly = array();

foreach ($associative as $row) {
    $indexedOnly[] = array_values($row);
}

json_encode($indexedOnly);

次のようなものを返します:

[
     [0, "name1", "n1"],
     [1, "name2", "n2"],
]

1
インデックス付き配列の手がかりをくれてありがとう:)問題は、IDがシーケンシャルIDではなく配列のIDでもあり、json_encodeが配列として取得しなかったような方法でインデックスを作成したことです。代わりにオブジェクト。配列はシーケンシャルではなかったため、修正されました。すべてのヘルプ担当者に感謝します:)

違います。一部のライブラリは、連想配列を要素プロパティの1つとしてインデックスを持つ配列としてエンコードします。
グスタボ2013年

意味がわかりません。Martinの回答の配列にはインデックスがありません。これは有効なJSONです。
そして最後に

@AndFinally、マーティンの答えの配列実際には暗黙的にインデックスが付けられています。インデックスを省略すると、ゼロから始まるインデックス付き配列になります。
BorisGuéry15年

この回答は、OPが質問を投稿したときにOPが求めていたものを完全には提供しませんでした(当然のことながら、OPが求めていたものは不可能でした)。質問。この回答は承認されているため削除できませんが、モデレーターに削除のフラグを立ててください。5票以上の賛成票があるため、担当者を維持できます。
Mark Amery、2015年

0

json_decode($ jsondata、true);

trueは、すべてのプロパティを配列に変換します(順次かどうか)


OPからの質問とは関係ありません。OPが使用して発生したエンコードの問題を具体的に尋ねたjson_encode
pg2286

これはどのように関連していませんか?これは、json_encodeを使用してデータを読み取り可能な配列に変換する例を示しています。OPの質問は、「配列を配列としてエンコードするためにjson_encodeを取得するにはどうすればよいですか」です。私のコードのビットは、まさにそれを実行します。「エンコード」とは、「に変わる」ことを意味します。それが反対投票の理由ではありません。
ロバート・シンクレア

ああ、私は今あなたのポイントを理解しています、あなたがこれがあなたが意図しているものであるなら、$serialized = json_encode($nonContiguousArray); $unserialize = json_decode($serialized, true); 最後にfinallySerializedInArrayFormat = json_encode($unserialize);このようなものをお勧めしますが、少し曲がった解決策のように見えました。
pg2286 2017年

-1

これを試して、

<?php
$arr1=array('result1'=>'abcd','result2'=>'efg'); 
$arr2=array('result1'=>'hijk','result2'=>'lmn'); 
$arr3=array($arr1,$arr2); 
print (json_encode($arr3)); 
?>

これは、OPが要求しようとしている問題を解決しません。
pg2286 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.