2012-06-25 45 views
90

Tôi có mảng sau đây trong PHP:json_encode thưa thớt PHP mảng như mảng JSON, không JSON đối tượng

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ó 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_encode về 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 ins tead của một mảng.

Làm cách nào để tôi có thể nhận được json_encode để mã hóa mảng của tôi dưới dạng mảng thay thế?

Trả lời

137

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

Chỉ cần có chỉ mục bằng số là không đủ. json_encode sẽ 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ự - tức là, nếu các khóa của nó là 0, 1, 2, 3, ...

Bạn có thể tuần tự mảng của mình bằng hàm array_values để có được hành vi mà bạn muốn. Ví dụ, đoạn code dưới đây làm việc thành công trong trường hợp sử dụng của bạn:

echo json_encode(array_values($input)). 
+2

Cảm ơn, đây là một câu trả lời rõ ràng đã làm việc cho tôi trong một tình huống tương tự! –

+2

+1 cho giải pháp sạch, một dòng. Tuy nhiên, đạo cụ vẫn còn Boris để minh họa cho giải pháp "dài tay" – jacobross85

+0

nhưng nếu các phím '0,2' là quan trọng? Tôi đang ở trong tình trạng tương tự mà tôi không thể reindex mảng. –

69

Array trong JSON là mảng được lập chỉ mục chỉ, do đó cấu trúc bạn đang cố gắng lấy không hợp lệ Json/Javascript.

Mảng kết hợp 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 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); 

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

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

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

+0

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

+0

Tôi không hiểu ý bạn là gì - 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ệ. –

-1

Hãy thử điều này,

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

điều này không giải quyết được vấn đề mà OP đang cố gắng hỏi. – user504879

0

json_decode ($ jsondata, true);

đúng biến tất cả các thuộc tính để mảng (tuần tự hay không)

+0

không liên quan đến câu hỏi được hỏi bởi OP. Vấn đề mã hóa được hỏi cụ thể gặp phải khi sử dụng 'json_encode' – user504879

+0

cách 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ể nhận được json_encode để mã hóa mảng của tôi như là một mảng" bit của tôi mã không chỉ là .. Tôi gussing đó là từ "Mã hóa" đó gây ra bạn greef? Bằng cách 'mã hóa', anh ta có nghĩa là 'biến thành'. Đó không phải là lý do để downvote. –

+0

oh Tôi thấy quan điểm của bạn bây giờ, mà bạn muốn giới thiệu một cái gì đó như thế này '$ đăng = json_encode ($ nonContiguousArray);' '$ unserialize = json_decode ($ đăng, true);' cuối cùng '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 chút giải pháp quanh co. – user504879

Các vấn đề liên quan