PHP: mulitdimensional dizideki bir anahtar mı alıyorsunuz?

4 Cevap

Ben gibi bir dizi var

$myArray =array
(
"0"=>array("dogs",98),
"1"=>array("cats",56),
"2"=>array("buffaloes",78)
)

Nasıl bir değer sağlayarak anahtarını alabilirsiniz?

örneğin i "manda" için arama array_search "2" döndürebilir.

Teşekkürler

4 Cevap

function asearch($key, $myArray) {
  for ($i = 0; $i < sizeof($myArray); $i++) {
    if ($myArray[$i][0] == $key) {
      return $i;
    }
  }
  return -1; # no match
}

Rağmen, muhtemelen diziyi yeniden isterdim:

$myarray = array(
  'dogs' => 98,
  'cats' => 56,
  'buffaloes' => 78
);

Ve sadece bunu:

$myArray['buffaloes']; # 78

Bunu yapabileceğiniz tek yolu, her öğe üzerinde yineleme ve preform bir Linear Search

$i = -1;
foreach ($myArray as $key => $item){
    if ( $item[0] == 'buffaloes' ){
        $i = $key;
        break;
    }
}
//$i now holds the key, or -1 if it doesn't exist

Gördüğünüz gibi dizi 20.000 öğeleri ve 'manda' olan, sanki 20.000 karşılaştırmalar yapmak zorunda, son madde gerçekten çok verimsiz olduğunu.

Eğer tuşunu kullanarak bir şeyler bakmak böylece başka bir deyişle, örneğin daha iyi bir şekilde, örneğin anahtar olarak arıyor dize böylece diziyi yeniden düzenlemek olabilir, veri yapılarını yeniden tasarlamak gerekiyor:

$myArray['buffaloes'] = 76;

Sadece (n dizideki öğe sayısı olduğu) n log n karşılaştırmalar en zorundadır, böylece daha iyi bir veri yapısını kullanır, çok daha hızlı olduğunu. Bir dizi aslında sıralı bir harita olmasıdır.

Başka bir seçenek, eğer bilirseniz sizin için arıyor değerinin tam değer kullanmak için array_search

Ben işlevi inşa duymadım. Eğer yukarıdaki çözümler daha genel bir şey istiyorsanız, kendi işlev ve kullanım özyineleme yazmak shold. belki array_walk_recursive yararlı olacaktır

You can Her girişin ilk elemanı "manda" eşit ise test dizinin her unsurları, üzerinde döngü.

Örneğin:

foreach ($myArray as $key => $value) {
    if ($value[0] == "buffaloes") {
        echo "The key is : $key";
    }
}

Alacak:

The key is : 2


Another idea (more funny ?), if you want to whole entry, might be to work with array_filter and a callback function that returns true for the "bufalloes" entry :

function my_func($val) {
    return $val[0] == "buffaloes";
}
$element = array_filter($myArray, 'my_func');
var_dump($element);

Alacak:

array
  2 => 
    array
      0 => string 'buffaloes' (length=9)
      1 => int 78

Ve

var_dump(key($element));

Gves Eğer 2 istedim.