Newsgroup: it.comp.www.php
Titolo: Domanda su sort

ciao a tutti,
ho un problema ad ordinare un array multidimensionale, faccio
subito un esempio:
$a_articoli[0]['titolo'] = 'NUOVA GOLF' ;
$a_articoli[0]['descrizione'] = 'Presentata nuova versione della...' ;
$a_articoli[1]['titolo'] = 'GOLF' ;
$a_articoli[1]['descrizione'] = 'Berlina VolksWagen nata nel ...' ;
$a_articoli[2]['titolo'] = 'MOTORI DELLA GOLF' ;
$a_articoli[2]['descrizione'] = 'Nuovi motori per la media tedesca ..' ;
$a_articoli[2]['titolo'] = 'CUCCARE CON LA GOLF' ;
$a_articoli[2]['descrizione'] = 'Utilizzare gli optional per ...' ;
e cosě via.
secondo voi č possibile ordinare l'array in modo tale che si abbia il 
seguente risultato:
$a_articoli[0]['titolo'] = 'GOLF' ;
$a_articoli[0]['descrizione'] = 'Berlina VolksWagen nata nel ...' ;
$a_articoli[1]['titolo'] = 'CUCCARE CON LA GOLF' ;
$a_articoli[1]['descrizione'] = 'Utilizzare gli optional per ...' ;
$a_articoli[2]['titolo'] = 'MOTORI DELLA GOLF' ;
$a_articoli[2]['descrizione'] = 'Nuovi motori per la media tedesca ..' ;
$a_articoli[3]['titolo'] = 'NUOVA GOLF' ;
$a_articoli[3]['descrizione'] = 'Presentata nuova versione della...' ;
e cosě via.
ciao .

 $a_articoli[3]['descrizione'] = 'Presentata nuova versione della...' ;
Introdurrei una nuova chiave, sulla quale poi fare l'ordinamento
tipo:
$a_articoli[0]['titolo'] = 'GOLF' ;
$a_articoli[0]['chiavediordinamento'] = ' ';
$a_articoli[0]['descrizione'] = 'Berlina VolksWagen nata nel ...' ;
$a_articoli[1]['titolo'] = 'GOLF' ;
$a_articoli[1]['chiavediordinamento'] = 'CUCCARE CON LA';
$a_articoli[1]['descrizione'] = 'Utilizzare gli optional per ...' ;
quindi ordini l'array muldimensionale per il campo 'chiavediordinamento' 
e il titolo in output lo ottieni concatenando 'titolo' e 
'chiavediordinamento'.
Spero di essermi spiegato.
Per quanto riguarda l'ordinamento di array multidimensionali  trovo 
molto utile la seguente funzione [copio/incollo dalle user notes del 
manuale on-line]
Ciao
--8<----8<----8<----8<----8<----8<----8<----8<----8<----8<----8<----8<----8<--
ok, now i made it a real (prooved) function, cause i needed to sort by 
two of the columns and it didn't work, sorting twice...
is was kinda tricky, cause i never handled with eval in php, but now 
it's quite superb - ok i didn't any errorhandling, but who cares *g*
___________
the function:
function array_csort() {  //coded by Ichier2003
    $args = func_get_args();
    $marray = array_shift($args);
    $msortline = "return(array_multisort(";
    foreach ($args as $arg) {
        $i++;
        if (is_string($arg)) {
            foreach ($marray as $row) {
                $sortarr[$i][] = $row[$arg];
            }
        } else {
            $sortarr[$i] = $arg;
        }
        $msortline .= "\$sortarr[".$i."],";
    }
    $msortline .= "\$marray));";
    eval($msortline);
    return $marray;
}
the fine thing is, you can add as many parameters you need, and you can 
add sort_flags as well (but be shure not to put em into " or ' - took 
some time for me to get this *g*)
______
syntax:
$new_array = array_multisort($array [, 'col1' [, SORT_FLAG [, 
SORT_FLAG]]]...);
__________
explanation:
$array is the array you want to sort, 'col1' is the name of the column 
you want to sort, SORT_FLAGS are : SORT_ASC, SORT_DESC, SORT_REGULAR, 
SORT_NUMERIC, SORT_STRING
you can repeat the 'col',FLAG,FLAG, as often you want, the highest 
prioritiy is given to the first - so the array is sorted by the last 
given column first, then the one before ...
_______
example:
in my case the array has it's index as first dimension (i like that for 
using foreach later):
$array[0]['name'] = "Niko";
$array[0]['age'] = 24;
$array[0]['town'] = "Berlin";
$array[1]['name'] = "Dennis";
$array[1]['age'] = 34;
$array[1]['town'] = "Berlin";
$array[2]['name'] = "Oliver";
$array[2]['age'] = 44;
$array[2]['town'] = "Aachen";
$array[3]['name'] = "Andi";
$array[3]['age'] = 34;
$array[3]['town'] = "Berlin";
_____________________
use the function like this:
$array = array_csort($array,'town','age',SORT_DESC,'name');
here the resulting array would be:
$array[0]['name'] = "Oliver";
$array[0]['age'] = 44;
$array[0]['town'] = "Aachen";
$array[1]['name'] = "Andi";
$array[1]['age'] = 34;
$array[1]['town'] = "Berlin";
$array[2]['name'] = "Dennis";
$array[2]['age'] = 34;
$array[2]['town'] = "Berlin";
$array[3]['name'] = "Niko";
$array[3]['age'] = 24;
$array[3]['town'] = "Berlin";
that should be enough :)
.. waiting this fuc to be included to the next php-release *gg*
hope it helps you..Niko
--8<----8<----8<----8<----8<----8<----8<----8<----8<----8<----8<----8<----8<--

grazie,
ti sei spiegato benissimo,
l'idea di una chiave non mi era venuta in mente e dopo disperati 
tentativi ho trovato una scappatoia di questo tipo
function cmp ($a,$b) {
    global $str_cmp ;
    $a = str_replace(strtolower($str_cmp),"",strtolower($a)) ;
    $b = str_replace(strtolower($str_cmp),"",strtolower($b)) ;
    if ($a == $b) return 0;
    return ($a > $b) ? 1 : -1;
}
$str_cmp = "GOLF" ;
$a_titoli[0] = "NUOVA GOLF" ;
$a_contenuti[$a_titoli[0]] = "Presentato il nuovo modello ..." ;
$a_titoli[1] = "MOTORI DELLA GOLF" ;
$a_contenuti[$a_titoli[1]] = "Nuovi i motori per le vetture ..." ;
$a_titoli[2] = "GOLF" ;
$a_contenuti[$a_titoli[2]] = "Berlina media Volkswagen ..." ;
$a_titoli[3] = "GOLF 2" ;
$a_contenuti[$a_titoli[3]] = "II versione della berlina tedesca ..." ;
$a_titoli[4] = "PASSAT" ;
$a_contenuti[$a_titoli[4]] = "Modello superiore nel catalogo ..." ;
usort ($a_titoli, "cmp");
//Verifica ...
for ($i=0;$i<sizeof($a_titoli);$i++)
{
    echo $i."-".$a_titoli[$i]."-".$a_contenuti[$a_titoli[$i]]."<br>" ;
}
pare che funzioni
grazie ancora !!
