2013-07-03 10 views
7

Ich habe eine Methode in einer Klasse, die so aussieht;PHP Sortierung array_intersect_key() Ergebnisse von zweiten Array

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)); 
    } 

Aber das ist nicht sinnvoll, da der Aufrufer der Methode nicht die Reihenfolge der Schlüssel/Elementpaar in dem assoziativen Array in Instanz versteckten Variable $ nicht kennt. Im Idealfall würde das zurückgegebene Array in der gleichen Reihenfolge wie die in $ list angegebenen Schlüssel sein. Zum Beispiel:

$foo = new SomeClass(); 
list($foo, $bar, $baz) = $foo->getAsList(array('foo', 'bar', 'baz'); 

ich einfach einig expliziten, ausführlichen PHP-Code in einer Schleife, dies zu tun schreiben kann, aber gibt es einige clevere Art und Weise die verschiedenen Array-Funktionen zu verwenden, z.B. array_multisort() spuckt dies in minimalen Codezeilen aus (und hoffentlich, bei kompilierter Code-Geschwindigkeit - ich werde es testen, wenn es darauf ankommt).

In gewissem Sinne ist dies ein Denkfehler, zu dem ich die Antwort noch nicht kenne. Es ist nicht kritisch, dass ich es ohne eine explizite Schleife mache, aber ich bin neugierig, ob es getan werden kann. Ich verbrachte 30 oder so Minuten darauf und habe noch keine Lösung gefunden.

+0

+1 Ursache Ich mag die Frage, aber ich möchte auch sicherstellen, dass du bist bewusst von 'extract()'. – goat

+0

Ich weiß über Extrakt(). Ich versuche explizit, es in meiner Klasse zu vermeiden, die diese Methode hat, da es leicht ist, Sicherheitsprobleme zu verursachen, wenn extract() falsch verwendet wird. Außerdem habe ich herausgefunden, dass das explizite Erstellen meiner benannten Variablen aus irgendeinem Grund schneller ist als extract() - zumindest in meinen kleinen Benchmarks. – CXJ

Antwort

7

Vielleicht array_replace ist das fehlende Stück zu Ihrem Puzzle:

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

Beispiel (Demo):

$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 
) 
*/