Heim > Backend-Entwicklung > PHP-Tutorial > Array_multisort Komplettlösung für mehrdimensionale Array-Sortierung

Array_multisort Komplettlösung für mehrdimensionale Array-Sortierung

高洛峰
Freigeben: 2016-10-20 14:52:40
Original
1451 Leute haben es durchsucht

1. Schauen wir uns zunächst die einfachste Situation an. Es gibt zwei Arrays:

$arr1 = array(1,9,5);
$arr2 = array(6,2,4);
array_multisort($arr1,$arr2);
print_r($arr1); // 得到的顺序是1,5,9
print_r($arr2); // 得到的顺序是6,4,2
Nach dem Login kopieren

Ich schätze, dass die Werte der beiden Arrays von Anfang bis Ende übereinstimmen: 1 entspricht 6, 9 entspricht 2, 5 entspricht 4.

Lassen Sie uns ein weiteres Array hinzufügen und sehen, was passiert:

$arr1 = array(1,9,5);
$arr2 = array(6,2,4);
$arr3 = array(3,7,8);
array_multisort($arr1,$arr2,$arr3);
Nach dem Login kopieren

3. Das Gleiche gilt für andere Elemente. Diese Entsprechung wird im Handbuch als „Beibehaltung der ursprünglichen Schlüsselnamenzuordnung während der Sortierung“ bezeichnet.

Sie können sich jedes Array auch als Spalte in einer Datenbanktabelle vorstellen. Die entsprechenden 1,6,3 sind eine Datenzeile und 9,2,7 sind eine andere Datenzeile. . .

array_multisort sortiert zuerst nach dem ersten Array (stellen Sie sich eine Spalte vor). Wenn die Werte des ersten Arrays (Spalte) gleich sind, dann sortieren Sie nach dem zweiten Array (Spalte).

Sie können zum Testen das folgende Programm verwenden:



$arr1 = array(1,9,5,9);
$arr2 = array(6,2,4,1);
$arr3 = array(3,7,8,0);
array_multisort($arr1,$arr2,$arr3);
Nach dem Login kopieren

Ausgabe:

Array ( [0] => 1 [1] => 5 [2] => 9 [3] => 9 ) 
Array ( [0] => 6 [1] => 4 [2] => 1 [3] => 2 ) 
Array ( [0] => 3 [1] => 8 [2] => 0 [3] => 7 )
Nach dem Login kopieren

Hier stellen wir fest, dass $arr1 normalerweise in aufsteigender Reihenfolge sortiert wurde. Aber $arr2 und $arr3 sind nicht sortiert.

Aber als ich genau hinsah, stellte ich fest, dass jedes Element dieser drei Arrays tatsächlich eins zu eins entsprach.

2. Als nächstes erklären wir die Parameter von array_multisort. Die Parameter dieser Funktion sind sehr flexibel. Der einfachste Fall besteht darin, wie oben gezeigt 1 oder n Arrays als Parameter zu verwenden. Dabei ist zu beachten, dass die Anzahl der Elemente in jedem Array gleich sein muss, da sonst eine Warnung zum Fehlschlagen der Sortierung führt.

So array_multisort($arr1,$arr2,$arr3); Standardmäßig werden alle Arrays in aufsteigender Reihenfolge sortiert. Wenn Sie $arr2 in absteigender Reihenfolge sortieren und als Zeichenfolge vergleichen möchten, müssen Sie dies tun schreibe:





array_multisort($arr1, $arr2, SORT_DESC, SORT_STRING, $arr3);
Nach dem Login kopieren

Jedem Array kann ein Sortierreihenfolge-Flag oder ein Sortiertyp-Flag oder beides folgen Flaggen können gleichzeitig erscheinen. Nach jedem Array kann jedoch nur ein Sortierflag jedes Typs erscheinen.

Details sind wie folgt:

Sortierungsreihenfolge-Flags:

SORT_ASC – Sortierung in aufsteigender Reihenfolge (Standard)

SORT_DESC – Sortierung in absteigender Reihenfolge

Sortierungstyp-Flag:

SORT_REGULAR – Elemente nach der üblichen Methode vergleichen (Standard)

SORT_NUMERIC – Elemente nach numerischen Werten vergleichen

SORT_STRING – Vergleichen Sie Elemente nach Zeichenfolgen

3. Welchen praktischen Effekt hat array_multisort?

Normalerweise haben wir einige mehrdimensionale Arrays, die sortiert werden müssen:




$guys = Array(
    [0] => Array
    (
        [name] => jake
        [score] => 80
        [grade] => A
    )
     
    [1] => Array
    (
        [name] => jin
        [score] => 70
        [grade] => A
    )
     
    [2] => Array
    (
        [name] => john
        [score] => 80
        [grade] => A
    )
     
    [3] => Array
    (
        [name] => ben
        [score] => 20
        [grade] => B
    )
)
Nach dem Login kopieren

Zum Beispiel möchten wir Sortieren Sie nach Noten in umgekehrter Reihenfolge, wenn die Noten gleich sind. Sortieren Sie einfach nach Namen in aufsteigender Reihenfolge.

Zu diesem Zeitpunkt müssen wir zwei weitere Arrays entsprechend der Reihenfolge von $guys erstellen:

>

$scores = array(80,70,80,20);
$names = array('jake','jin','john','ben');
Nach dem Login kopieren

Das ist es

Kann Ist es flexibler? Muss ich jedes Mal, wenn ich sortieren möchte, zusätzliche Arrays besorgen?

Tatsächlich ist es gut in der helper_array-Klasse von qeephp gekapselt. Hier sind die beiden Methoden. Wer es benötigt, kann es selbst ändern:

array_multisort($scores, SORT_DESC, $names, $guys);
Nach dem Login kopieren



/**
* 根据指定的键对数组排序
*
* 用法:
* @code php
* $rows = array(
* array('id' => 1, 'value' => '1-1', 'parent' => 1),
* array('id' => 2, 'value' => '2-1', 'parent' => 1),
* array('id' => 3, 'value' => '3-1', 'parent' => 1),
* array('id' => 4, 'value' => '4-1', 'parent' => 2),
* array('id' => 5, 'value' => '5-1', 'parent' => 2),
* array('id' => 6, 'value' => '6-1', 'parent' => 3),
* );
*
* $rows = Helper_Array::sortByCol($rows, 'id', SORT_DESC);
* dump($rows);
* // 输出结果为:
* // array(
* // array('id' => 6, 'value' => '6-1', 'parent' => 3),
* // array('id' => 5, 'value' => '5-1', 'parent' => 2),
* // array('id' => 4, 'value' => '4-1', 'parent' => 2),
* // array('id' => 3, 'value' => '3-1', 'parent' => 1),
* // array('id' => 2, 'value' => '2-1', 'parent' => 1),
* // array('id' => 1, 'value' => '1-1', 'parent' => 1),
* // )
* @endcode
*
* @param array $array 要排序的数组
* @param string $keyname 排序的键
* @param int $dir 排序方向
*
* @return array 排序后的数组
*/
static function sortByCol($array, $keyname, $dir = SORT_ASC)
{
return self::sortByMultiCols($array, array($keyname => $dir));
}
Nach dem Login kopieren

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage