2011-06-18 49 views
34

Tôi có một mảng như:PHP - Nhận giá trị mảng với một số chỉ số

$array = array('foo' => 'bar', 33 => 'bin', 'lorem' => 'ipsum'); 
echo native_function($array, 0); // bar 
echo native_function($array, 1); // bin 
echo native_function($array, 2); // ipsum 

Vì vậy, chức năng có nguồn gốc này sẽ trả về một giá trị dựa trên một số chỉ số (arg giây), bỏ qua các phím assoc, tìm kiếm vị trí thực trong mảng.

Có chức năng gốc nào để làm điều đó trong PHP hay tôi nên viết nó? Cảm ơn

+3

Điều này nghe như một ý tưởng tồi. Bạn cần cái này để làm gì? Nó sẽ không được nhiều hơn thích hợp hơn để thực sự có các phím số trong trường hợp này, và 'foo' giá trị như là một thành viên của một mảng phụ? –

+0

Tôi cũng nghĩ rằng, điều này trông giống như thiết kế xấu. Bạn có thể cho chúng tôi biết bạn đang cố gắng làm gì không? Có lẽ có giải pháp tốt hơn. – Alp

Trả lời

11

array_values() sẽ làm khá nhiều những gì bạn muốn:

$numeric_indexed_array = array_values($your_array); 
// $numeric_indexed_array = array('bar', 'bin', 'ipsum'); 
print($numeric_indexed_array[0]); // bar 
+0

... và, kể từ PHP 5.4, hãy nghiền nó xuống: print (array_values ​​($ your_array) [0]); – Pancho

77
$array = array('foo' => 'bar', 33 => 'bin', 'lorem' => 'ipsum'); 
$array = array_values($array); 
echo $array[0]; //bar 
echo $array[1]; //bin 
echo $array[2]; //ipsum 
4

Vâng, cho các giá trị vô hướng, một sự kết hợp của implodearray_slice sẽ làm:

$bar = implode(array_slice($array, 0, 1)); 
$bin = implode(array_slice($array, 1, 1)); 
$ipsum = implode(array_slice($array, 2, 1)); 

Hoặc trộn lên với array_valueslist (nhờ @nikic) để nó hoạt động với tất cả các loại giá trị:

list($bar) = array_values(array_slice($array, 0, 1)); 
+0

+1 Mặc dù tôi đã sử dụng 'list ($ bar) = array_slice ($ array, 0, 1)' để loại bỏ giới hạn giá trị vô hướng;) – NikiC

+0

@nikic: Tôi đã nghĩ về điều đó, thật không may, 'array_slice' sẽ giữ chuỗi các phím (ngay cả khi * preserve_keys * là * false *), vì vậy bạn không thể sử dụng 'list' trong trường hợp đó, trừ khi bạn' mảng_values' mảng kết quả. Dù sao, tôi đoán đó cũng là một giải pháp, chỉnh sửa. Cảm ơn. – netcoder

4

Tôi đang đề xuất ý tưởng của mình về nó chống lại mọi bất lợi array_values() chức năng, bởi vì tôi nghĩ rằng đó không phải là chức năng nhận trực tiếp. Bằng cách này, nó phải tạo một bản sao của các giá trị mảng được đánh số theo số và sau đó truy cập. Nếu PHP không ẩn một phương thức tự động dịch một số nguyên ở vị trí của phần tử mong muốn, có thể một giải pháp tốt hơn có thể bao gồm một hàm chạy mảng với bộ đếm cho đến khi nó dẫn đến vị trí mong muốn, sau đó trả về phần tử .

Vì vậy, công việc sẽ được tối ưu hóa cho một loạt các kích thước rất lớn, vì thuật toán sẽ là chỉ số hoạt động tốt nhất cho nhỏ, dừng ngay lập tức. Tuy nhiên, trong giải pháp được đánh dấu là array_values(), nó phải thực hiện với chu kỳ chảy qua toàn bộ mảng, ngay cả khi, ví dụ: tôi phải truy cập mảng $ [1].

function array_get_by_index($index, $array) { 

    $i=0; 
    foreach ($array as $value) { 
     if($i==$index) { 
      return $value; 
     } 
     $i++; 
    } 
    // may be $index exceedes size of $array. In this case NULL is returned. 
    return NULL; 
} 
+0

Nhưng nếu 'false' là giá trị được tìm nạp thì sao? Trả về 'null' sẽ vẫn tệ nhưng tốt hơn' false'. – user619271

+0

Xem xét tính nhất quán của loại, tôi sẽ nhận giá trị NULL hoặc nếu chỉ mục đầu vào vượt quá kích thước của mảng, hoặc nếu giá trị đích từ đầu vào chỉ mục là NULL. Trong trường hợp này tôi đồng ý với bạn. Tuy nhiên FALSE và NULL cho cùng một kết quả trên hàm empty(), đó sẽ là lần kiểm tra tiếp theo sẽ được thực hiện trong bất kỳ kịch bản nào, nó có ý nghĩa để gọi hàm này. –

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