2010-11-24 9 views
3

Dieser Code läuft nicht richtig, aber es schlägt vor, was ich zu tun versucht:PHP Art 2D-Array von Index (nicht assoziative)

function sort_2d_by_index($a,$i) { 
    function cmp($x, $y) { 
    // Nested function, can't find $i 
    // (global $i defeats the purpose of passing an arg) 
    if ($x[$i] == $y[$i]) { return 0; } 
    return ($x[$i] < $y[$i]) ? -1 : 1; 
    } 

    usort($a,"cmp"); 
    return $a; 
} 

Es hat ein viel besserer Weg, dies zu tun. Ich habe ksort(), multisort() und alle möglichen Sorten untersucht, bis ich irgendwie müde bin, alles zu sortieren.

Die Situation ist folgende: Ich habe ein 2-D-Array ...

array(
    array(3,5,7), 
    array(2,6,8), 
    array(1,4,9) 
); 

habe ... und ich mag von einem Spaltenindex sortieren. Sprich, Spalte [1], würde dieses Ergebnis geben:

array(
    array(1,4,9), 
    array(3,5,7), 
    array(2,6,8) 
); 

jemand einen Link Hat (Ich bin sicher, dass dies vor gefragt wurde), oder könnte jemand sagen: „Sie foosort müssen, auf jeden Fall“. Vielen Dank.

Antwort

7

In der documentation von array_multisort wird erwähnt, dass es für diese Art von Sache verwendet werden kann.

Sie können nicht vermeiden, dass ein Array erstellen, die nur eine Spalte besteht aus:

$sort_column = array(); 
foreach ($a as $row) 
    $sort_column []= $row[1]; // 1 = your example 

array_multisort($sort_column, $a); 

Diese sortiert beide Arrays synchron, so dass danach Ihre ganze Reihe in der gleichen Reihenfolge wie die $ sort_column Array sortiert ist.

Ab PHP 5.3 können Sie verwenden ein closure ($i in die Funktion übergeben), indem Sie Ihre cmp Funktion wie folgt definieren:

$cmp = function($x, $y) use ($i) { ... }; 
+0

+1 für 'verwenden' aha das ist, was ich suche ich denke. – Ben

+0

Danke auch für den Verschlusslink. Es stellt sich heraus, dass die Lösung "array_multisort" The One ist, bis PHP 5.3 weiter verbreitet ist. Ich hatte mir die Dokumentation angesehen, aber keine so gute Erklärung gefunden. Schade, dass ich nicht zweimal akzeptieren kann, ist diese Antwort großartig :) – Ben

1

können Sie use verwenden, um Zugriff auf $i:

function cmp($x, $y) use ($i) { 
    // $i now available 
    if ($x[$i] == $y[$i]) { return 0; } 
    return ($x[$i] < $y[$i]) ? -1 : 1; 
} 
+3

... in PHP 5.3. – AndreKR

+0

+1 für 'use' aha das ist, was ich suche ich denke. – Ben