2010-03-20 66 views
22

tôi có thể tạo ra một mảng thưa thớt php (hoặc bản đồ) bằng cách sử dụng lệnh:Giải mã thưa thớt đối tượng json để php mảng

$myarray = array(10=>'hi','test20'=>'howdy'); 

Tôi muốn serialize/deserialize này như JSON. Tôi có thể tuần tự hóa nó bằng cách sử dụng lệnh:

$json = json_encode($myarray); 

kết quả là chuỗi {"10":"hi","test20":"howdy"}. Tuy nhiên, khi tôi deserialize này và đúc nó vào một mảng bằng cách sử dụng lệnh:

$mynewarray = (array)json_decode($json); 

Tôi dường như mất bất kỳ ánh xạ với các khóa không phải là định danh php hợp lệ. Tức là, mynewarray có ánh xạ 'test20'=>'howdy', nhưng không phải 10=>'hi' cũng không '10'=>'hi'.

Có cách nào để bảo toàn các phím số trong bản đồ php khi chuyển đổi và quay trở lại từ json sử dụng các chức năng chuẩn json_encode/json_decode không?

(Tôi đang sử dụng PHP Version 5.2.10-2ubuntu6.4.)

Trả lời

47

json_decode trả về một đối tượng kiểu stdClass theo mặc định. Bạn truy cập các thành viên dưới dạng thuộc tính (ví dụ: $result->test20). 10 không phải là tên hợp lệ cho thuộc tính, đó là lý do bạn mất nó.

Thay vì đúc để một mảng, bạn có thể vượt qua true như một cuộc tranh luận thứ hai để json_decode để làm cho nó trở lại một mảng kết hợp bản thân:

$mynewarray = json_decode($json, true);

Nếu bạn làm điều đó, $mynewarray[10] sẽ hoạt động tốt.

+0

Cảm ơn Chris, đây chính xác là những gì tôi cần. –

+0

'true' là quan trọng, để thực hiện trong loại mảng PHP, khác' stdClass Object' – Rafee

+0

omg, cảm ơn người đàn ông, nó chỉ thổi bộ não của tôi. Tôi đổ mảng, thấy chìa khóa, nhưng không thể truy cập vào val của nó. – GoldenTabby

2

Phiên bản PHP nào? Trên 5.2 sau chương trình/script

$myarray = array(10=>'hi','test20'=>'howdy'); 
$json = json_encode($myarray); 
$mynewarray = (array) json_decode($json); 
var_dump($mynewarray); 

Đầu ra

array(2) { 
    ["10"]=> 
    string(2) "hi" 
    ["test20"]=> 
    string(5) "howdy" 
} 

nào không hiển thị hành vi mà bạn đang mô tả.

Điều đó nói rằng, nếu các phiên bản của PHP được miscasting JSON, hãy thử sử dụng get_object_vars trên đối tượng stdClass rằng json_decode lợi nhuận

get_object_vars(json_decode($json)) 

Điều đó có thể đưa ra kết quả tốt hơn.

+0

nó có "10" chỉ mục mà không thể được truy cập thông qua '[]' nhà điều hành trong PHP – vava

+0

Ah, có nó, nó serialize phím như một chuỗi đó xảy ra là một số, mà bạn không thể có được tại. Giải pháp get_object_vars nên giải quyết điều đó, cũng như tham số thứ hai của json_decode, đã đề cập ở trên. –

2

Sự cố trong chuyển đổi từ đối tượng thành mảng.

$a = (array)json_decode('{"10":"hi","test20":"howdy"}'); 
var_dump($a); 

//outputs 
array(2) { 
    ["10"]=> 
    string(2) "hi" 
    ["test20"]=> 
    string(5) "howdy" 
} 

Xem cách mảng này có chỉ mục "10"? Nhưng trong PHP, mọi thứ trông giống như một số được chuyển đổi thành một số, đặc biệt là trong các chỉ mục mảng. Bạn không thể chỉ nhận được a["10"] vì nó chuyển đổi "10" thành một số và mảng này không có chỉ mục như vậy.

Tuy nhiên, foreach hoạt động.

foreach ($a as $key => $value) { 
    var_dump($key); 
    var_dump($value); 
} 

//outputs 
string(2) "10" 
string(2) "hi" 
string(6) "test20" 
string(5) "howdy" 

Bạn cũng có thể coi kết quả của json_decode là đối tượng. Mặc dù bạn sẽ không thể thực hiện $a->10 hoặc $a->"10",

$a = json_decode('{"10":"hi","test20":"howdy"}'); 
$b = 10; 
var_dump($a->$b); 

//outputs 
string(2) "hi" 

hoạt động.

Nhưng rất có thể, như Chris đã nói, bạn chỉ muốn vượt qua true làm đối số thứ hai.

$a = json_decode('{"10":"hi","test20":"howdy"}', true); 
var_dump($a[10]); 

//outputs 
string(2) "hi" 
Các vấn đề liên quan