php - lấy chỉ mục số của mảng kết hợp


154

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

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

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

Câu trả lời:


272
echo array_search("car",array_keys($a));

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

7
@KevinBurke Sẽ không đặt hàng lại trừ khi bạn sử dụng chức năng sắp xếp. Không chắc chắn loại bảo đảm nào bạn đang tìm kiếm, nhưng nó không giống như mô hình JavaScript khi không có thứ tự tĩnh cho các mảng kết hợp.
Fosco

6
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

4
Điều này KHÔNG hoạt động nếu mảng kết hợp được trộn lẫn, vì array("val1", "val2", "car" => "val3")nó sẽ tạo ra 0, đó là sai ...
Xriuk



2

  $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)));


2
function arrayValuePosition($value, $array)
{
    return array_search($value, array_keys($array));
}

2

Trong khi câu trả lời của Fosco không sai, có một trường hợp được xem xét với câu hỏi 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 này nhưng nó có một vấn đề: nếu tôi chạy mã của Fosco, tôi nhận được lỗi 0 đó , 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 chuỗi thành số nguyên (theo ý kiến ​​của tôi là hơi ngu ngốc), vì vậy khi array_search()tìm kiếm chỉ mục, nó dừng lại ở lần đầu tiên vì rõ ràng ("car" == 0) là đúng .
Đặt array_search()ở chế độ nghiêm ngặt sẽ không giải quyết được vấn đề vì sau đó array_search("0", array_keys($a))sẽ trả về false ngay cả khi một phần tử có chỉ số 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ỉ mục từ array_keys()thành 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)));

In 1, đó là chính xác.

EDIT:
Như Shaun đã chỉ ra trong bình luận bên dưới, điều tương tự cũng áp dụng cho giá trị chỉ mục, nếu bạn tình cờ tìm kiếm một chỉ mục int như thế này:

$a = array(
  "foo" => "bar",
  "nice",
  "car" => "fast",
  "none"
);
$ind = 0;
echo array_search($ind, array_map("strval", array_keys($a)));

Bạn sẽ luôn nhận được 0, đó là sai, vì vậy giải pháp sẽ là truyền chỉ mục (nếu bạn sử dụng một biến) thành một chuỗi như thế này:

$ind = 0;
echo array_search((string)$ind, array_map("strval", array_keys($a)));

1
Khi truyền một biến, bạn cũng nên truyền nó dưới dạng một chuỗi, vì truyền 0 cho một mảng kết hợp sẽ có tác động tiêu cực tương tự. Ví dụ: var_dump(array_search(0, array_map("strval", array_keys($a))));sẽ luôn xuất ra int (0), thay vì bool (false).
Shaun Cockerill

@ShaunCockerill ngay! Cập nhật câu trả lời của tôi, cảm ơn vì đã chỉ ra điều này!
Xriuk

0

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

 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. Chúng thường nhanh hơn nhiều so với logic tương đương được viết ra từ lâu trong mã PHP.
Bill Karwin

3
Điều này có lẽ nhanh hơn array_search, nó thực hiện một loại đầu tiên và vì vậy nó rất chậm.
Alasdair

À, nhưng mã tích hợp được biên dịch trước 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

0

Tất cả các giải pháp dựa trên mảng_key không hoạt động cho các mảng hỗn hợp. Giải pháp rất đơn giản:

echo array_search($needle,array_keys($haystack), true);

Từ php.net: Nếu nghiêm ngặt tham số thứ ba được đặt thành TRUE thì hàm Array_search () sẽ tìm kiếm các phần tử giống hệt nhau trong haystack. Điều này có nghĩa là nó cũng sẽ thực hiện một phép so sánh nghiêm ngặt của kim trong đống cỏ khô và các đối tượng phải giống nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.