2015-07-02 9 views
7

Wenn eine ziemlich grundlegende uasort Funktion in PHP haben, die wie folgt aussieht:Access-Array-Schlüssel in PHP uasort

uasort($arr, function($a, $b) { 
       if ($a > $b) 
        return -1; 
       if ($a < $b) 
        return 1; 
... 
} 

Das Array Aussehen zu sortieren, wie die folgende Ich versuche:

{[1642] => 1, [9314] => 4, [1634] => 3 ...} 

Es enthält Ganzzahlen, die meine Hauptvergleichskriterien sind. Wenn die Ganzzahlen jedoch gleich sind, würde ich gerne auf ihre Schlüsselwerte innerhalb der uasort-Funktion zugreifen und etwas Magie damit machen, um die Sortierung von dort herauszufinden.

Ich habe keine Ahnung, wie das zu tun, wie es scheint, dass die $a und $b Variablen, die in die Funktion übergeben bekommen sind nur die ganzen Zahlen ohne die entsprechenden Tasten, aber es sollte ein Weg sein, um den Schlüssel zugreifen und da ich m Verwenden einer Funktion, um die Schlüssel tatsächlich zu erhalten. Irgendwelche Ideen?

+0

Welche Magie reden wir hier? Es kann andere Wege geben, dies zu tun. – Andrew

+0

Die 'Magie' oder die Logik der Anwendung ist ziemlich durcheinander, da es spezielle DB-Abfragen erfordert, wenn die Ganzzahlen gleich sind. Glücklicherweise sind sie das meiste nicht und ich könnte mir einen Workaround vorstellen, zum Beispiel, indem ich ein anderes 2D-Array erzeuge, das die ganzen Zahlen als einen Wert und den Schlüssel als einen anderen Wert enthält und dann an den Uasort weiterleitet. Ich hoffe jedoch, dass es einen besseren und einfacheren Weg gibt, dies zu tun. – mmvsbg

Antwort

10
uksort($arr, function ($a, $b) use ($arr) { 
    return $arr[$a] - $arr[$b] ?: $a - $b; 
}); 

Sie können die Werte der Schlüssel, so uksort benutzen, die Ihnen die Schlüssel gibt. Ersetzen Sie $a - $b durch Ihre passende Magie, hier wird nur nach dem Wert des Schlüssels sortiert.

+0

Nur aus Interesse: Ist es nur meine PHP 5.3.1 Umgebung, oder beobachten andere Benutzer Probleme mit der 'use()' Klausel? – cars10m

+1

Es funktioniert auch in meiner Umgebung, wenn Sie 'use (& $ arr)' verwenden und nicht nur 'using ($ arr)'. Der Inhalt (dh die Reihenfolge) von '$ arr' ändert sich im Laufe der Zeit und' use ($ arr) 'würde nur mit einer ** statischen Kopie ** arbeiten, siehe hier: http: //php.net/manual/de /functions.anonymous.php – cars10m

+0

Danke, genau das, was ich brauchte. Ich Gast 'Uasort' ist nur die falsche Funktion in diesem Fall zu verwenden. Ich laufe auf PHP 5.4 und 5.5 damit keine Probleme mit der "Verwendung", die out of the box funktioniert. – mmvsbg

0

Die use Richtlinie (in-Lösung deceze) funktioniert nicht in meiner alten PHP 5.3.1 Installation, während dies das Ergebnis liefern:

$arr=array('1642'=>1,'9314'=>2,'1634'=>1,'1633'=>5,'1636'=>7,'1610'=>1); 
print_r($arr); 

function mycmp($a, $b) { 
if ($a > $b) return -1; 
if ($a < $b) return 1; 
else return 0; 
} 
function mysrt($arr){ 
foreach ($arr as $k => $v) $new[$k]="$v $k"; 
uasort($new, 'mycmp'); $ret=array(); 
foreach ($new as $k => $v) $ret[$k]=$arr[$k]; 
return $ret; 
} 
print_r(mysrt($arr)); 

mysrt() sortiert nicht 'in-place', sondern wird wieder das sortierte Array. Und natürlich: Meine "Magie" bei der Schlüsselsortierung ist eher einfach. Schlüssel werden auf die gleiche Weise wie die Werte sortiert. Indem Sie die Anweisung $new[$k]="$v $k"; ändern, können Sie das Verhalten an Ihre Bedürfnisse anpassen.

als Randnotiz ...

deceze Lösung wird Arbeit nur auf meinem Server, wenn ich use(&$arr) statt use($arr):

uksort($arr, function ($a, $b) use(&$arr) { 
    return $arr[$a] - $arr[$b] ? $arr[$a] - $arr[$b] : $a - $b; 
});