2010-10-06 36 views
17

Tôi đang gặp phải hành vi kỳ lạ với json_encode sau khi xóa khóa mảng số bằng unset. Các mã sau đây sẽ làm cho vấn đề rõ ràng. Tôi đã chạy nó từ cả hai CLI và như một Apache mod:PHP json_encode làm đối tượng sau khi bỏ qua mảng PHP()

PHP phiên bản thông tin:

C:\Users\usr\Desktop>php -v 
PHP 5.3.1 (cli) (built: Nov 20 2009 17:26:32) 
Copyright (c) 1997-2009 The PHP Group 
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies 

PHP Mã

<?php 

$a = array(
    new stdclass, 
    new stdclass, 
    new stdclass 
); 
$a[0]->abc = '123'; 
$a[1]->jkl = '234'; 
$a[2]->nmo = '567'; 

printf("%s\n", json_encode($a)); 
unset($a[1]); 
printf("%s\n", json_encode($a)); 

Chương trình Output

C:\Users\usr\Desktop>php test.php 
[{"abc":"123"},{"jkl":"234"},{"nmo":"567"}] 
{"0":{"abc":"123"},"2":{"nmo":"567"}} 

Như bạn có thể thấy, lần đầu tiên $a được chuyển thành JSON nó được mã hóa dưới dạng một mảng javascript. Lần thứ hai (sau cuộc gọi unset) $a được mã hóa dưới dạng đối tượng javascript. Tại sao điều này và làm thế nào tôi có thể ngăn chặn nó?

+0

+1 vì bạn nên xem câu hỏi hay. :) – Spudley

Trả lời

16

Lý do là mảng của bạn có một lỗ trong đó: nó có chỉ số 0 và 2, nhưng bỏ qua 1. JSON không thể mã hóa mảng bằng lỗ vì cú pháp mảng không hỗ trợ cho chỉ mục.

Thay vào đó, bạn có thể mã hóa array_values($a), sẽ trả về một mảng được lập lại.

+0

Hoặc bạn có thể sắp xếp mảng sau khi unsetting một phần tử. – NullUserException

+0

@NullUserException Mặc dù điều đó sẽ có tác dụng phụ, tốt, phân loại mảng của bạn. – zneak

+0

Đối với những người tự hỏi về hành vi 'unset', hãy xem liên kết sau và cuộn xuống" Chức năng hữu ích ": http://us3.php.net/manual/en/language.types.array.php " Không được đặt() chức năng cho phép loại bỏ các khóa từ một mảng. Hãy lưu ý rằng mảng sẽ không được reindexed " – leepowers

5

Ngoài các kỹ thuật array_values nó có thể sử dụng array_splice và loại bỏ một phần tử và tái chỉ mục trong một bước:

unset($a[1]); 

Thay vào đó:

array_splice($a, 1, 1); 
+1

cách hoàn hảo hoàn hảo để thực hiện công việc mà không làm rối tung bộ sưu tập, cảm ơn! – CookieMonster

+1

Điều này. Cách thanh lịch nhất. – DQM

2

Cố gắng sử dụng JSON_FORCE_OBJECT lựa chọn cho json_encode, như: json_encode($a, JSON_FORCE_OBJECT) vì vậy bạn sẽ luôn có kết quả tương tự.

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