2010-07-29 42 views
121

Tôi có một mảng liên kết và tôi cần tìm vị trí số của khóa. Tôi có thể lặp qua mảng bằng tay để tìm nó, nhưng có cách nào tốt hơn để xây dựng thành PHP không?php - nhận chỉ mục số của mảng kết hợp

$a = array(
    'blue' => 'nice', 
    'car' => 'fast', 
    'number' => 'none' 
); 

// echo (find numeric index of $a['car']); // output: 1 

Trả lời

201
echo array_search("car",array_keys($a)); 
+2

PHP có đảm bảo thứ tự của một mảng kết hợp không? –

+4

@KevinBurke Nó sẽ không sắp xếp lại nó trừ khi bạn sử dụng một chức năng sắp xếp. Bạn không chắc chắn về loại bảo đảm mình đang tìm kiếm, nhưng nó không giống như mô hình JavaScript, nơi không có thứ tự tĩnh đối với mảng kết hợp. – Fosco

+4

Các chỉ mục được cung cấp bởi "array_keys" sẽ không nhất thiết phải khớp với chỉ mục của mảng ban đầu. Ví dụ, nếu bạn đã thay đổi mảng bằng cách sử dụng "unset" hoặc một số hàm khác, sẽ có một khoảng trống còn lại trong chỉ mục của mảng ban đầu, nhưng array_keys sẽ tạo ra một mảng mới. – SEoF

0

một giải pháp tôi đã đưa ra ... có lẽ khá kém hiệu quả so tho Fosco của giải pháp:

protected function getFirstPosition(array$array, $content, $key = true) { 

    $index = 0; 
    if ($key) { 
    foreach ($array as $key => $value) { 
    if ($key == $content) { 
    return $index; 
    } 
    $index++; 
    } 
    } else { 
    foreach ($array as $key => $value) { 
    if ($value == $content) { 
    return $index; 
    } 
    $index++; 
    } 
    } 
} 
+2

Vâng, PHP có hàng ngàn hàm dựng sẵn vì một lý do. Đây là * thường * nhanh hơn nhiều so với logic tương đương được viết ra theo cách dài trong mã PHP. –

+3

Điều này có lẽ nhanh hơn 'mảng_search', có sắp xếp đầu tiên và do đó nó rất chậm. – Alasdair

+0

Ah, nhưng mã được tích hợp sẵn được biên dịch sẵn và tìm kiếm rất có thể sẽ là tìm kiếm nhị phân (giả sử nó sắp xếp các mục trước). – SEoF

1

    $a = array(
     'blue' => 'nice', 
     'car' => 'fast', 
     'number' => 'none' 
); 
var_dump(array_search('car', array_keys($a))); 
var_dump(array_search('blue', array_keys($a))); 
var_dump(array_search('number', array_keys($a))); 
 
3
function arrayValuePosition($value, $array) 
{ 
    return array_search($value, array_keys($array)); 
} 
0

Trong khi câu trả lời của Fosco không sai, có một trường hợp được coi là với trường hợp này: mảng hỗn hợp. Hãy tưởng tượng tôi có một mảng như thế này:

$a = array(
    "nice", 
    "car" => "fast", 
    "none" 
); 

Bây giờ, PHP cho phép loại cú pháp nhưng nó có một vấn đề: nếu tôi chạy mã Fosco của tôi nhận được 0đó là sai đối với tôi, nhưng tại sao điều này xảy ra?
Bởi vì khi thực hiện so sánh giữa các chuỗi và số nguyên PHP chuyển đổi xâu kí tự sang số nguyên (và đây là kinda ngu ngốc theo ý kiến ​​của tôi), vì vậy khi array_search() tìm kiếm các chỉ số nó dừng lại ở một đầu tiên bởi vì rõ ràng ("car" == 0)là đúng.
Đặt array_search() thành chế độ nghiêm ngặt sẽ không giải quyết được sự cố vì sau đó array_search("0", array_keys($a)) sẽ trả về false ngay cả khi một phần tử có chỉ mục 0 tồn tại.
Vì vậy, giải pháp của tôi chỉ chuyển đổi tất cả các chỉ số từ array_keys() thành các chuỗi và sau đó so sánh chúng một cách chính xác:

echo array_search("car", array_map("strval", array_keys($a))); 

Prints 1 đó là chính xác

+0

Khi truyền một biến, bạn cũng nên chuyển nó thành một chuỗi, khi truyền số không đến một mảng kết hợp sẽ có cùng tác động tiêu cực. Ví dụ: 'var_dump (array_search (0, array_map (" strval ", array_keys ($ a))));' sẽ luôn luôn xuất 'int (0)', thay vì 'bool (false)'. –

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