Der richtige Weg, um zu vergleichen, ob zwei Arrays gleich sind, ist die Verwendung von strenger Gleichheit (===), die rekursiv vergleicht. Vorhandene Antworten sind nicht in der Lage, ein beliebiges Array (Array beliebiger Tiefe und Reihenfolge, das eine Mischung aus sequentiellen und assoziativen Arrays enthält) rekursiv zu sortieren und können daher keine Vergleiche beliebiger Arrays verarbeiten. Sequentielle Arrays sind assoziative Arrays mit einem sequentiellen Schlüssel (0,1,2,3...), während assoziative Arrays keinen sequentiellen Schlüssel haben.
Um diese beliebigen Arrays zu sortieren, müssen wir das tun:
- Abwärts zu Blattknoten ohne weitere Unterfelder verfahren
- Sortieren sequentieller Arrays durch Serialisierung und anschließendes Sortieren (damit keine benutzerdefinierten Komparatoren verwendet werden müssen)
- Assoziative Arrays nach Schlüssel sortieren
Der folgende Code implementiert die oben beschriebene Lösung. Verbesserungen des Codes sind willkommen.
function recur_sort( &$array ) {
foreach ( $array as &$value ) {
if ( is_array( $value ) ) recur_sort( $value );
}
if ( is_sequential_array( $array ) ) {
$array = array_map( function( $el ) { return json_encode( $el ); }, $array );
sort( $array, SORT_STRING );
$array = array_map( function( $el ) { return json_decode( $el, true ); }, $array );
return;
} else {
return ksort( $array );
}
}
function is_sequential_array(Array &$a) {
$n = count($a);
for($i=0; $i<$n; $i++) {
if(!array_key_exists($i, $a)) {
return false;
}
}
return true;
}
Beispiel (in PHPUnit):
//A stricter and recursive assertEqualsCanonicalizing
public function assertSameCanonicalizing( $expected, $actual ) {
recur_sort( $expected );
recur_sort( $actual );
$this->assertSame( $expected, $actual );
}