Sto cercando di ordinare una matrice di matrici multidimensionali su più di una colonna. Per complicarlo ulteriormente mi piacerebbe essere in grado di impostare specifiche opzioni di ordinamento per chiave/colonna. Ho ciò che è simile al risultato di una query DB, ma in realtà non proviene da uno, quindi la necessità di ordinarlo in PHP piuttosto che SQL.Ordina array di matrici multi-dimensionali su più di una "colonna" (chiave) con opzioni di ordinamento specificate
Array
(
[0] => Array
(
[first_name] => Homer
[last_name] => Simpson
[city] => Springfield
[state] => Unknown
[zip] => 66735
)
[1] => Array
(
[first_name] => Patty
[last_name] => Bouvier
[city] => Scottsdale
[state] => Arizona
[zip] => 85250
)
[2] => Array
(
[first_name] => Moe
[last_name] => Szyslak
[city] => Scottsdale
[state] => Arizona
[zip] => 85255
)
[3] => Array
(
[first_name] => Nick
[last_name] => Riviera
[city] => Scottsdale
[state] => Arizona
[zip] => 85255
)
)
Vorrei essere in grado di ordinarlo in modo simile a ciò che potrebbe essere fatto con una query DB. Oh, ea volte una colonna/chiave deve essere specificata dal numero.
Quello che avevo in mente era qualcosa di simile a questo:
$sortOptions = array(array('city', SORT_ASC, SORT_STRING),
array('zip', SORT_DESC, SORT_NUMERIC),
array(2, SORT_ASC, SORT_STRING) // 2='last_name'
);
$sorter = new MultiSort($data, $sortOptions);
$sortedData = $sorter->getSortedArray() ;
print_r($jmsSorted);
Quello che vorrei finire con questo:
Array
(
[0] => Array
(
[first_name] => Nick
[last_name] => Riviera
[city] => Scottsdale
[state] => Arizona
[zip] => 85255
)
[1] => Array
(
[first_name] => Moe
[last_name] => Szyslak
[city] => Scottsdale
[state] => Arizona
[zip] => 85255
)
[2] => Array
(
[first_name] => Patty
[last_name] => Bouvier
[city] => Scottsdale
[state] => Arizona
[zip] => 85250
)
[3] => Array
(
[first_name] => Homer
[last_name] => Simpson
[city] => Springfield
[state] => Unknown
[zip] => 66735
)
)
UPDATE: Penso che idealmente, un la soluzione risulterebbe nella creazione dinamica
array_multisort($city, SORT_ASC, SORT_STRING, $zip, SORT_DESC, SORT_NUMERIC, $last_name, SORT_ASC, SORT_STRING, $inputArray);
Il il problema è che non voglio dover "hardcoded" quei nomi chiave lì dentro. Ho cercato di creare una soluzione basata su Esempio # 3 banca dati Ordinamento dei risultati dalla documentazione array_multisort()
che ha finito per utilizzare array_multisort()
ma io non riesco a trovare un modo per utilizzare la mia lista di argomenti costruita in modo dinamico per array_multisort()
.
Il mio tentativo è stato quello di "catena" tali argomenti insieme in un array e poi
call_user_func_array('array_multisort', $functionArgs);
che si traduce in un
Warning: Parameter 2 to array_multisort() expected to be a reference, value given in...
Sono d'accordo sul non avere una risposta "giusta", ma maledizione, questo è molto vicino alle mie esigenze, con l'eccezione che ho bisogno di ordinare un array indicizzato, non uno associativo. –
Ricevo un "Avviso: usort(): la matrice è stata modificata dalla funzione di confronto utente", utilizzando questo codice. Ho trovato la seguente spiegazione, commenterò quando posso risolverlo: http://stackoverflow.com/questions/3235387/usort-array-was-modified-by-the-user-comparison-function – vicenteherrera