ilişkilendirilebilir dizinin sayısal dizinini al


154

İlişkilendirilebilir bir dizi var ve bir anahtarın sayısal konumunu bulmak gerekir. Ben dizi bulmak için manuel olarak döngü olabilir, ama PHP içine inşa daha iyi bir yolu var mı?

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

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

Yanıtlar:


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

5
PHP ilişkilendirilebilir bir dizinin sırasını garanti ediyor mu?
Kevin Burke

7
@KevinBurke Bir sıralama işlevi kullanmadığınız sürece yeniden sipariş vermeyecektir. Ne tür bir garanti aradığınızdan emin değilsiniz, ancak ilişkilendirilebilir diziler için statik bir siparişin olmadığı JavaScript modeli gibi değil.
Fosco

6
"Array_keys" tarafından verilen dizinler, orijinal dizinin diziniyle eşleşmeyebilir. Örneğin, diziyi "unset" veya başka işlevler kullanarak değiştirdiyseniz, orijinal dizinin dizininde bir boşluk kalır, ancak array_keys yeni bir dizi oluşturur.
SEoF

4
array("val1", "val2", "car" => "val3")0
İlişkisel dizi karışıksa



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

Fosco'nun yanıtı yanlış olmasa da, bununla birlikte düşünülmesi gereken bir durum var : karışık diziler. Böyle bir dizi var düşünün:

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

Şimdi, PHP bu tür bir sözdizimine izin veriyor, ancak bir problemi var: Fosco'nun kodunu çalıştırırsam benim için 0 yanlış olanı alıyorum , ama neden oluyor?
Çünkü dizeler ve tamsayılar arasında karşılaştırmalar yaparken PHP dizeleri tamsayılara dönüştürür (ve bu benim görüşüme göre biraz aptalca), bu yüzden array_search()indeks aradığında ilkinde durur çünkü görünüşe ("car" == 0) göre doğrudur . Sıkı moda
ayarlamak array_search()sorunu çözmez çünkü array_search("0", array_keys($a))dizin 0'a sahip bir öğe olsa bile yanlış döndürür.
Benim çözümüm sadece tüm dizinleri array_keys()dizelere dönüştürür ve sonra doğru bir şekilde karşılaştırır:

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

1Doğru olan baskılar .

DÜZENLEME:
Shaun, aşağıdaki yorumda belirtildiği gibi, böyle bir int dizini ararsanız aynı şey dizin değeri için de geçerlidir:

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

Her zaman alırsınız 0, bu yanlıştır, böylece çözüm dizini (bir değişken kullanırsanız) şöyle bir dizeye dökmek olacaktır:

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

1
Bir değişkeni iletirken, ilişkilendirilebilir bir diziye sıfır iletmek aynı negatif etkiye sahip olacağından, bir dize olarak da yayınlamanız gerekir. Örneğin: yerine var_dump(array_search(0, array_map("strval", array_keys($a))));her zaman çıktı verir . int (0)bool (false)
Shaun Cockerill

@ShaunCockerill doğru! Cevabımı güncelledim, bunu işaret ettiğiniz için teşekkürler!
Xriuk

0

Geldiğim bir çözüm ... Fosco'nun çözümüyle karşılaştırıldığında muhtemelen oldukça verimsiz:

 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
Evet, PHP'nin binlerce yerleşik işlevi vardır. Bunlar genellikle PHP kodunda uzun yolla yazılan eşdeğer mantığa göre çok daha hızlıdır.
Bill Karwin

3
Bu muhtemelen daha hızlıdır array_search, bu da önce bir tür yapar ve bu yüzden acı verici yavaştır.
Alasdair

Ah, ancak yerleşik kod önceden derlenmiştir ve arama büyük olasılıkla bir ikili arama olacaktır (önce öğeleri sıraladığı varsayılarak).
SEoF

0

Array_keys tabanlı tüm çözümler karışık diziler için çalışmaz. Çözüm basit:

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

Php.net'ten: Üçüncü katı parametre TRUE olarak ayarlanırsa, array_search () işlevi samanlıkta aynı öğeleri arar. Bu, samanlıkta iğnenin katı bir tür karşılaştırması gerçekleştireceği ve nesnelerin aynı örnek olması gerektiği anlamına gelir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.