php - dapatkan indeks numerik dari array asosiatif

154

Saya memiliki array asosiatif dan saya perlu menemukan posisi numerik kunci. Saya bisa mengulang-ulang array secara manual untuk menemukannya, tetapi apakah ada cara yang lebih baik untuk membangun PHP?

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

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

Jawaban:

273
echo array_search("car",array_keys($a));
Fosco
sumber
5
Apakah PHP menjamin urutan array asosiatif?
Kevin Burke
7
@KevinBurke Ini tidak akan memesan ulang kecuali jika Anda menggunakan fungsi sortir. Tidak yakin jenis jaminan apa yang Anda cari, tetapi tidak seperti model JavaScript di mana tidak ada urutan statis untuk array asosiatif.
Fosco
6
Indeks yang diberikan oleh "array_keys" tidak akan selalu cocok dengan indeks array asli. Misalnya, jika Anda telah mengubah array dengan menggunakan "unset" atau sejumlah fungsi lainnya, akan ada celah yang tersisa di indeks array asli, tetapi array_keys akan menghasilkan array baru.
SEoF
4
Ini TIDAK berfungsi jika array asosiatif dicampur, karena array("val1", "val2", "car" => "val3")akan menghasilkan 0, yang salah ...
Xriuk
35
$blue_keys = array_search("blue", array_keys($a));

http://php.net/manual/en/function.array-keys.php

quantumSoup
sumber
8
+1 menyelamatkan saya 5 saat google mencari fungsi yang saya gunakan untuk mengetik komentar ini.
Aditya MP
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)));

Asterión
sumber
2
function arrayValuePosition($value, $array)
{
    return array_search($value, array_keys($array));
}
Andrey Vorobyev
sumber
2

Sementara jawaban Fosco tidak salah, ada kasus yang harus dipertimbangkan dengan yang ini: array campuran. Bayangkan saya memiliki array seperti ini:

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

Sekarang, PHP memperbolehkan sintaksis semacam ini tetapi memiliki satu masalah: jika saya menjalankan kode Fosco saya mendapatkan 0 yang salah , tetapi mengapa ini terjadi?
Karena ketika melakukan perbandingan antara string dan integer PHP mengubah string ke integer (dan ini agak bodoh menurut saya), jadi ketika array_search()mencari indeks, ia berhenti pada yang pertama karena tampaknya ("car" == 0) benar .
Menyetel array_search()ke mode ketat tidak akan menyelesaikan masalah karena array_search("0", array_keys($a))akan mengembalikan false meskipun ada elemen dengan indeks 0.
Jadi solusi saya hanya mengonversi semua indeks dari array_keys()ke string dan kemudian membandingkannya dengan benar:

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

Cetakan 1, mana yang benar.

EDIT:
Seperti yang Shaun tunjukkan dalam komentar di bawah, hal yang sama berlaku untuk nilai indeks, jika Anda mencari indeks int seperti ini:

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

Anda akan selalu mendapatkan 0, yang salah, jadi solusinya adalah dengan melemparkan indeks (jika Anda menggunakan variabel) ke string seperti ini:

$ind = 0;
echo array_search((string)$ind, array_map("strval", array_keys($a)));
Xriuk
sumber
1
Ketika melewati variabel, Anda juga harus melemparkannya sebagai string, karena melewati nol ke array asosiatif akan memiliki efek negatif yang sama. Sebagai contoh: var_dump(array_search(0, array_map("strval", array_keys($a))));akan selalu menghasilkan int (0), bukan bool (false).
Shaun Cockerill
@ShaunCockerill benar! Memperbarui jawaban saya, terima kasih telah menunjukkan ini!
Xriuk
0

solusi saya datang dengan ... mungkin cukup tidak efisien dibandingkan dengan solusi 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++;
   }
  }
 }
n00b
sumber
2
Ya, PHP memiliki ribuan fungsi bawaan karena suatu alasan. Ini biasanya jauh lebih cepat daripada logika setara yang ditulis dalam kode PHP.
Bill Karwin
3
Ini mungkin lebih cepat daripada array_search, yang melakukan penyortiran pertama dan karenanya sangat lambat.
Alasdair
Ah, tetapi kode bawaan sudah dikompilasi, dan pencarian kemungkinan besar akan menjadi pencarian biner (dengan asumsi ia mengurutkan item terlebih dahulu).
SEoF
0

Semua solusi berdasarkan array_keys tidak berfungsi untuk array campuran. Solusinya sederhana:

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

Dari php.net: Jika parameter ketiga ketat diatur ke TRUE maka fungsi array_search () akan mencari elemen identik di tumpukan jerami. Ini berarti ia juga akan melakukan perbandingan jenis jarum yang ketat di tumpukan jerami, dan benda-benda harus merupakan contoh yang sama.

MrBlc
sumber