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

คุณกำลังสังเกตพฤติกรรมนี้เนื่องจากอาร์เรย์ของคุณไม่ใช่ลำดับ - มีคีย์0และ2แต่ไม่มี1เป็นคีย์

แค่มีดัชนีตัวเลขไม่เพียงพอ json_encodeจะเข้ารหัสอาร์เรย์ PHP ของคุณเป็นอาร์เรย์ JSON เท่านั้นหากอาร์เรย์ PHP ของคุณเป็นลำดับนั่นคือถ้าคีย์เป็น 0, 1, 2, 3, ...

คุณสามารถทำดัชนีอาร์เรย์ของคุณใหม่ตามลำดับโดยใช้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

ArrayในJSONเป็นอาร์เรย์ที่จัดทำดัชนีเท่านั้นดังนั้นโครงสร้างที่คุณพยายามรับจึงไม่ใช่ Json / Javascript ที่ถูกต้อง

อาร์เรย์ PHP Associatives เป็นออบเจ็กต์ใน JSON ดังนั้นหากคุณไม่ต้องการดัชนีคุณจะไม่สามารถทำการแปลงดังกล่าวได้

หากคุณต้องการรับโครงสร้างดังกล่าวคุณสามารถทำได้:

$indexedOnly = array();

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

json_encode($indexedOnly);

จะส่งคืนสิ่งที่ต้องการ:

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

1
ขอบคุณที่ให้เบาะแสของอาร์เรย์ที่จัดทำดัชนี :) ปัญหาคือฉันจัดทำดัชนีในลักษณะที่ id ยังเป็น id ของอาร์เรย์แทนที่จะเป็นรหัสตามลำดับและ json_encode ไม่ได้เลือกเป็นอาร์เรย์ แต่เหมือนใน วัตถุแทนเนื่องจากอาร์เรย์ไม่ได้เรียงตามลำดับตอนนี้ขอบคุณสำหรับความช่วยเหลือของคุณ :)

ไม่จริง. ไลบรารีบางแห่งเข้ารหัสอาร์เรย์ที่เชื่อมโยงเป็นอาร์เรย์ที่มีดัชนีเป็นหนึ่งในคุณสมบัติขององค์ประกอบ
Gustavo

ฉันไม่เข้าใจว่าคุณหมายถึงอะไรอาร์เรย์ในคำตอบของ Martin ไม่ได้รับการจัดทำดัชนีและนั่นคือ JSON ที่ถูกต้อง
และในที่สุด

@AndFinally อาร์เรย์ในคำตอบของมาร์ตินที่มีการจัดทำดัชนีจริงโดยปริยาย การละเว้นดัชนีส่งผลให้อาร์เรย์ที่จัดทำดัชนีเริ่มต้นจากศูนย์
Boris Guéry

คำตอบนี้ไม่ได้ให้สิ่งที่ OP ต้องการในขณะที่พวกเขาโพสต์คำถาม (ไม่น่าแปลกใจที่สิ่งที่ OP ต้องการเป็นไปไม่ได้) และการแก้ไขของพวกเขาตั้งแต่นั้นมาทำให้คำตอบนี้ดูเหมือนจะผิดอย่างมากเนื่องจากสถานะปัจจุบันของ คำถาม. คุณไม่สามารถลบคำตอบนี้ได้เนื่องจากได้รับการยอมรับ แต่อาจตั้งค่าสถานะให้ผู้ดูแลลบคำตอบนี้ให้คุณ? เนื่องจากมีการโหวตมากกว่า 5 ครั้งคุณจะยังคงเป็นตัวแทนของคุณ
Mark Amery

0

json_decode ($ jsondata จริง);

trueเปลี่ยนคุณสมบัติทั้งหมดให้เป็นอาร์เรย์ (ตามลำดับหรือไม่)


ไม่เกี่ยวข้องกับคำถามที่ OP ถาม OP ถามเฉพาะปัญหาการเข้ารหัสที่พบโดยใช้json_encode
pg2286

มันไม่เกี่ยวข้องกันได้อย่างไร? นี่แสดงตัวอย่างของการใช้ json_encode เพื่อเปลี่ยนข้อมูลให้เป็นอาร์เรย์ที่อ่านได้ คำถามของ OP คือ "ฉันจะให้ json_encode เข้ารหัสอาร์เรย์ของฉันเป็นอาร์เรย์ได้อย่างไร" บิตโค้ดของฉันทำได้แค่นั้น .. ฉันงงว่ามันคือคำว่า "เข้ารหัส" ที่ทำให้คุณกรีก? โดย 'เข้ารหัส' เขาหมายถึง 'กลายเป็น' นั่นไม่ใช่เหตุผลที่จะลดคะแนน
Robert Sinclair

โอ้ฉันเห็นจุดของคุณตอนนี้ที่คุณจะแนะนำบางอย่างเช่นนี้$serialized = json_encode($nonContiguousArray); $unserialize = json_decode($serialized, true); ในที่สุดก็finallySerializedInArrayFormat = json_encode($unserialize);ว่านี้คือสิ่งที่คุณมีความประสงค์ที่คุณมีสิทธิ แต่ดูเหมือนจะเป็นวิธีการแก้ปัญหายืดเล็ก ๆ น้อย ๆ
pg2286

-1

ลองสิ่งนี้

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

สิ่งนี้ไม่ได้ช่วยแก้ปัญหาสิ่งที่ OP พยายามถาม
pg2286
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.