Sers
Ich bastel grad eine Sortierfunktion für Zeilen aus einer CSV-Textdatei.
Nun liegen mir die Zeilen als Array folgendermaßen vor:
Diese möchte ich nun nach beliebigen Kriterien sortieren können wie man es aus einer SQL-Datenbank gewohnt ist. Die Kriterien liegen mir folgendermaßen als Array vor:
Das zweite Array kann theoretisch eine beliebige Anzahl an field/direction Paaren enthalten, daher habe ich mich für array_multisort zum sortieren entschieden.
Der Aufruf erfolgt ja laut Handbuch folgendermaßen:
Da ich die Anzahl der Parameter nicht kenne rufe ich array_multisort mit call_user_func_array auf.
Folgendermaßen wird das Array welches als Parameter übergeben wird aufgebaut:
$multiSortArguments hat beim Aufruf von call_user_func_array folgenden Inhalt:
Nun wird eine Warning ausgegeben das array_multisort den zweiten Parameter (in diesem Beispiel also das SORT_DESC) als Referenz erwartet und schlägt somit fehl. Ich kann aber keine Referenz auf eine Konstante übergeben.
Eine mögliche Lösung sieht folgendermaßen aus:
Ich muss quasi für jedes Feld eine Variable anlegen und diese als Referenz in das Array eintragen welches an array_multisort als Funktionsparameter übergeben wird. Ein Array kann ich für die Zwischenspeicherung der Sortierrichtungen nicht nutzen da dieses auch nur wieder skalare Werte enthalten würde die ich nicht als Referenz übergeben kann.
Mit den variablen Variablen geht es aber ich finde diese Lösung unschön.
Jemand eine Idee wie es anders geht oder woran es liegen kann das array_multisort SORT_ASC/DESC bei einem Aufruf via call_user_func_array nur als Referenz annimmt und nicht wie beim normalen Aufruf als Wert der Konstanten?
Ich bastel grad eine Sortierfunktion für Zeilen aus einer CSV-Textdatei.
Nun liegen mir die Zeilen als Array folgendermaßen vor:
Code:
Array ( [0] => Array ( [id] => 3 [author] => test [message] => test text 3 [date] => ) [1] => Array ( [id] => 4 [author] => test [message] => test text 4 [date] => ) )
Code:
Array ( [0] => Array ( [field] => id [direction] => desc ) )
Der Aufruf erfolgt ja laut Handbuch folgendermaßen:
PHP-Code:
array_multisort($band, SORT_DESC, $auflage, SORT_ASC, $data);
Folgendermaßen wird das Array welches als Parameter übergeben wird aufgebaut:
PHP-Code:
if (!is_null($order)) {
$orderColumns = array();
$multiSortArguments = array();
//$order enthält das oben gepostete Array mit den field/direction Paaren
//$seletedRows enthält das erste Array mit den Zeilen die zu sortieren sind
foreach ($order AS $o) {
//hier werden die für array_multisort benötigten Daten in Spaltenform zusammengebaut
foreach ($selectedRows AS $r) {
$orderColums[$o['field']][] = $r[$o['field']];
}
//und an das Array welches call_user_func_array als Parameter übergeben werden drangehängt
$multiSortArguments[] = &$orderColums[$o['field']];
//hier wird die Sortierichtung an das Parameterarray angehängt damit array_multisort immer ein Array+Sortierkriterium Päärchen bekommt
if ($o['direction'] == 'asc') {
$multiSortArguments[] = \SORT_ASC;
}
if ($o['direction'] == 'desc') {
$multiSortArguments[] = \SORT_DESC;
}
}
//zuletzt wird das Originalarray angehängt um die Beziehungen $orderColums über den Schlüssel aufrecht zu erhalten
$multiSortArguments[] = &$selectedRows;
call_user_func_array('array_multisort', $multiSortArguments);
}
Code:
array(3) { [0]=> &array(2) { [0]=> string(1) "3" [1]=> string(1) "4" } [1]=> int(3) [2]=> &array(2) { [0]=> array(4) { ["id"]=> string(1) "3" ["author"]=> string(4) "test" ["message"]=> string(11) "test text 3" ["date"]=> NULL } [1]=> array(4) { ["id"]=> string(1) "4" ["author"]=> string(4) "test" ["message"]=> string(11) "test text 4" ["date"]=> NULL } } }
Eine mögliche Lösung sieht folgendermaßen aus:
PHP-Code:
if ($o['direction'] == 'asc') {
${$o['field'].'_dir'} = \SORT_ASC;
$multiSortArguments[] = &${$o['field'].'_dir'};
}
if ($o['direction'] == 'desc') {
${$o['field'].'_dir'} = \SORT_DESC;
$multiSortArguments[] = &${$o['field'].'_dir'};
}
Mit den variablen Variablen geht es aber ich finde diese Lösung unschön.
Jemand eine Idee wie es anders geht oder woran es liegen kann das array_multisort SORT_ASC/DESC bei einem Aufruf via call_user_func_array nur als Referenz annimmt und nicht wie beim normalen Aufruf als Wert der Konstanten?
Kommentar