2012-04-26 30 views
19

Với một mảng kết hợp như sau,Thứ tự các khóa có được trả về từ mảng_không giống như thứ tự trong mảng đầu vào không?

$field_defaults = array(
    'id' => 0, 
    'name' => 'new item', 
    'desc' => '', 
    'parent_id' => 0, 
); 

tôi có thể dựa vào array_keys() trở các phím theo thứ tự chúng được xác định? Hoặc, chính xác hơn, vì các mảng trong PHP dường như có một thứ tự ổn định, theo this answer, các khóa có được trả về bởi array_keys() theo thứ tự giống như chúng xuất hiện trong mảng đầu vào không? manual page không đưa ra bất kỳ gợi ý nào.

Khi tôi thử điều này, họ dường như để tôn trọng thứ tự ban đầu, nhưng tôi muốn có thể dựa vào hành vi đó.

Trả lời

30

TL; DR: Về mặt lý thuyết bạn không thể tin tưởng vào nó; cho các mục đích thực tế IMO bạn có thể.


Vì tài liệu không đảm bảo đặt hàng thì về mặt kỹ thuật, câu trả lời chính xác sẽ là "không, bạn không thể tin tưởng vào điều đó".

Đó là vì lý thuyết các nhà phát triển có thể chọn để tự bảo lưu tùy chọn thay đổi triển khai vào một ngày trong tương lai để không tôn trọng trật tự hiện tại nữa (có thể cải thiện hiệu suất hoặc để đạt được một số lợi ích khác) .

Bây giờ là một thực tế vấn đề , chúng ta biết rằng the current implementation honors the ordering - mảng PHP được sắp xếp container (có một danh sách liên kết các giá trị trong số những thứ khác) - và đây là một cái gì đó bạn sẽ không bao giờ mong đợi để thay đổi .

Nếu có, thay đổi sẽ gợi ý đến một thay đổi đáng kể tương ứng trong việc triển khai nội bộ mảng và điều đó sẽ có khả năng phá vỡ nhiều mã khác nữa. Tôi không thấy nó xảy ra bất cứ lúc nào.

+0

Đọc nguồn, Luke. –

+0

+1 cho OpenGrok –

1

Nếu bạn quan tâm, bạn luôn có thể chọn một thứ tự đúng và sau đó thực hiện lại chức năng khác dựa trên đó. Và nếu bạn quan tâm đến tính nhất quán giữa hai cuộc gọi, có thể bạn sẽ gọi cả hai số array_keysarray_values cùng một lúc. Vậy tại sao không làm cả hai cùng một lúc? Ví dụ: giả sử thứ tự của array_keys() là "đúng". Sau đó, hãy thực hiện:

function arrayKV($arr) { 
    $keys = array_keys($arr); 
    $values = array(); 
    foreach($keys as $key) { 
     $newArr[] = $arr[$key]; 
    } 
    return array('keys' => $keys, 'values' => $values); 
} 

Bằng cách đó, bạn biết rằng chúng giống nhau. Ngoài ra, bạn có thể cung cấp các phím để sử dụng làm đơn đặt hàng:

function arrayValuesStable($arr, $keys) { 
    $values = array(); 
    foreach($keys as $key) { 
     $values[] = $arr[$key]; 
    } 
    return $values; 
} 
Các vấn đề liên quan