2009-02-20 7 views
12

Görünüşte çok basit bir şey yapmak istiyorum, ancak bu konuda bir şey bulamıyorum: sadece array_splice benzeri bir dizinin bir alt kümesini ayıklayın, ancak almak değerler:İlişkisel bir diziden (php) bir değer kümesi ayıklanıyor

$data = array('personName' => 'John', 'personAge' => 99, 'personId' => 1, 
       /* many more data I don't need here ... */); 

list($name, $age, $id) = array_splice_by_keys($data, 
          array('personName', 'personAge', 'personId'); 

bütün bunlardan başarısız olursa, anahtar tarafından bir ilişkisel dizi filtrelemek için bir yerleşik işlevi yok? Örneğin:

$ filtersArray = array__extract__keys__and__values ​​($ srcArray, $ arrayOfWantedKeys);

// create a new array with ONLY those key => values I need 
$wanted_values = array_extract_keys_and_values($data, 
        array('personName', 'personAge', 'personId'); 

echo $wanted_values['personName']; 

İlkini yapmak istiyorum neden nedenini tahmin, kullanılan değerleri kopyalamak için daha iyi optimize görünüyor, ben bütün kod üzerinde ilişkisel dizi erişimi tekrarlamayı kalmamasıdır çok fazla (örneğin bir döngüde), yerel bir değişkene, artı $ somearray ['name'] 'den $ name yazmak çok daha kolay.

DÜZENLEME: Teşekkürler, ben liste ile kullanılmak üzere tahmin çözüm array_flip kullanımını Intesresting

list($x, $y, $z) = array_values(array_intersect_key($array, array_flip($wantedKeys))); 

olurdu! php sürümü> = içinde

cevap

7

Eğer array_intersect_key kullanabilirsiniz 5.1.0: $ex yılında

$data = array('personName' => 'John', 'personAge' => 99, 'personId' => 1, 
      'test' => 23); 
$ex = array('personName'=>0, 'personAge'=>0, 'personId'=>0); 
var_dump(array_intersect_key($data, $ex)); 

değerleri onlar sadece mevcut olmak zorunda, önemli değil.

27

Bu temelde SilentGhost'un cevabı ile aynıdır, ancak bu daha kolay olabilir ve muhtemelen biraz daha yavaş olabilir.

array_intersect_key($array, array_flip($wantedKeys));