2013-07-03 29 views
7

Böyle bir sınıfa bir yöntem var; Yöntemin arayan gizli örnek değişken Doları cinsinden ilişkisel dizi anahtar/eleman çiftlerinin sırası bilmez beriPHP sıralama array_intersect_key() sonuçları ikinci dizilime göre

class SomeClass { 
    private $hidden = array(....); 

    /** 
    * @return array - numeric indexed array in order of $this->hidden. 
    * Suitable for use by list(var1, var2, ...) 
    */ 
    public function getAsList($list = array()) 
    { 
     return array_values(array_intersect_key($this->hidden, array_flip($list)); 
    } 

Ama bu, yararlı değildir. İdeal olarak, döndürülen dizi $ listesinde belirtilen anahtarlarla aynı sırada olacaktır. Örneğin:

$foo = new SomeClass(); 
list($foo, $bar, $baz) = $foo->getAsList(array('foo', 'bar', 'baz'); 
Kolayca bunu yapmanın bir döngü içinde bazı açık, ayrıntılı bir PHP kodu yazabilirsiniz, ancak çeşitli dizi fonksiyonlarını kullanmak için bazı akıllı yolu yoktur

, mesela array_multisort() bunu en az kod satırında tükürür (ve umarım derlenmiş kod hızıyla - eğer önemliyse, test edeceğim). Bir anlamda, bu henüz cevabı bilmediğim bir beyin teaser'ıdır. Kritik değil, açık bir döngü olmadan yapıyorum ama yapılabiliyorsa merak ediyorum. Üzerinde 30 dakika harcadım ve henüz bir çözüm bulamadım.

public function getAsList($list = array()) 
{ 
    $klist = array_flip($list); 
    return array_values(array_intersect_key(array_replace($klist, $this->hidden), $klist)); 
} 

Örnek (Demo):

+0

+1 i soru gibi ama ben de sen emin olmak neden extract() 'ın farkında olmak. – goat

+0

Ben extract() hakkında biliyorum. Bu yönteme sahip olan sınıfımdan kaçınmak için açık bir şekilde çalışıyorum, çünkü ekstraksiyon() yanlış kullanılırsa güvenlik sorunlarına neden oluyor. Ayrıca, adlandırılmış değişkenlerimi açıkça oluşturmanın aslında herhangi bir nedenle extract() 'dan daha hızlı olduğunu keşfettim - en azından küçük ölçütler kümesinde. – CXJ

cevap

7

Belki array_replace sizin bulmacanın eksik parçası

$hidden = [ 
    'apples' => 19, 
    'eggs' => 7, 
    'grapes' => 144, 
    'mushrooms' => 3, 
    'oranges' => 16 
]; 

$list = ['grapes', 'apples', 'eggs', 'oranges']; 

$klist = array_flip($list); 
print_r(array_values(array_intersect_key(array_replace($klist, $hidden), $klist))); 

/* 
Array 
(
    [0] => 144 
    [1] => 19 
    [2] => 7 
    [3] => 16 
) 
*/