json_encode mảng PHP thưa thớt dưới dạng mảng JSON, không phải đối tượng JSON


119

Tôi có mảng sau trong PHP:

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

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

Tôi muốn JSON mã hóa nó thành một mảng JSON, tạo ra một chuỗi như sau:

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

Nhưng khi tôi gọi json_encodetrên mảng này, tôi nhận được như sau:

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

là một đối tượng thay vì một mảng.

Làm cách nào json_encodeđể mã hóa mảng của tôi dưới dạng một mảng?

Câu trả lời:


194

Bạn đang quan sát hành vi này bởi vì mảng của bạn không tuần tự - nó có khóa 02nhưng không có 1dưới dạng khóa.

Chỉ có chỉ mục số là không đủ. json_encodesẽ chỉ mã hóa mảng PHP của bạn dưới dạng mảng JSON nếu mảng PHP của bạn là tuần tự - nghĩa là, nếu các khóa của nó là 0, 1, 2, 3, ...

Bạn có thể lập chỉ mục lại mảng của mình một cách tuần tự bằng cách sử dụng array_valueshàm để có được hành vi bạn muốn. Ví dụ: mã dưới đây hoạt động thành công trong trường hợp sử dụng của bạn:

echo json_encode(array_values($input)).

4
nhưng nếu chìa khóa 0,2quan trọng thì sao? Tôi đang ở trong tình huống tương tự, nơi tôi không thể lập chỉ mục lại mảng.
shyammakwana.me

2
JSON không hỗ trợ mảng kết hợp. tham khảo: tools.ietf.org/html/rfc7159#section-5
Nguyễn Văn Vinh

74

Arraytrong JSONlà mảng chỉ mục duy nhất , vì vậy cấu trúc bạn đang cố gắng để có được không phải là hợp lệ Json / Javascript.

Mảng Liên kết PHP là các đối tượng trong JSON, vì vậy trừ khi bạn không cần chỉ mục, bạn không thể thực hiện các chuyển đổi như vậy.

Nếu bạn muốn có cấu trúc như vậy, bạn có thể làm:

$indexedOnly = array();

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

json_encode($indexedOnly);

Sẽ trả về một cái gì đó như:

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

1
Cảm ơn vì đã cho tôi manh mối của mảng được lập chỉ mục :) vấn đề là tôi đã lập chỉ mục nó theo cách mà id cũng là id của mảng thay vì id tuần tự và json_encode đã không chọn nó như một mảng mà như trong đối tượng thay vì mảng không tuần tự của nó cố định bây giờ nhờ for all guys giúp đỡ của bạn :)

Không đúng. Một số thư viện mã hóa mảng kết hợp dưới dạng mảng với chỉ mục là một trong các thuộc tính của phần tử.
Gustavo

Tôi không hiểu ý bạn - mảng trong câu trả lời của Martin không được lập chỉ mục và đó là JSON hợp lệ.
Và cuối cùng là

@AndFinally, các mảng trong Martin của câu trả lời thực sự được lập chỉ mục, ngầm. Việc bỏ qua chỉ mục dẫn đến một mảng được lập chỉ mục bắt đầu từ 0.
Boris Guéry

Câu trả lời này không hoàn toàn cung cấp những gì OP muốn tại thời điểm họ đăng câu hỏi (không ngạc nhiên, vì những gì OP muốn là không thể), và các chỉnh sửa của họ đối với nó kể từ đó đã khiến câu trả lời này dường như hoàn toàn sai với tình trạng hiện tại của câu hỏi. Bạn không thể xóa câu trả lời này, vì nó được chấp nhận, nhưng có thể gắn cờ để người kiểm duyệt xóa nó cho bạn? Vì nó có hơn 5 lượt ủng hộ, bạn sẽ giữ lại lượt ủng hộ của mình.
Mark Amery

0

json_decode ($ jsondata, true);

true biến tất cả các thuộc tính thành mảng (tuần tự hoặc không)


không liên quan đến câu hỏi của OP. OP đặc biệt yêu cầu mã hóa vấn đề gặp phải sử dụngjson_encode
pg2286

làm thế nào là điều này không liên quan? điều này cho thấy một ví dụ về việc sử dụng json_encode để nó biến dữ liệu thành một mảng có thể đọc được. Câu hỏi của OP là "Làm thế nào tôi có thể lấy json_encode để mã hóa mảng của tôi dưới dạng một mảng" bit mã của tôi làm được điều đó .. Tôi đang buồn nôn đó là từ "Mã hóa" gây ra cho bạn? Bằng cách 'mã hóa' anh ấy có nghĩa là 'biến thành'. Đó không phải là lý do để từ chối.
Robert Sinclair

ồ, tôi thấy quan điểm của bạn bây giờ, rằng $serialized = json_encode($nonContiguousArray); $unserialize = json_decode($serialized, true); cuối cùng bạn sẽ giới thiệu một cái gì đó như thế này finallySerializedInArrayFormat = json_encode($unserialize);nếu đây là những gì bạn đang có ý định, bạn là đúng, nhưng có vẻ như một giải pháp nhỏ.
pg2286

-1

Thử cái này,

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

điều này không giải quyết được vấn đề mà OP đang cố gắng hỏi.
pg2286
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.