Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    7

    Ordinamento per più criteri di un Array

    Ciao a tutti!
    Mi sono appena iscritto e vengo subito al dunque..

    Sto cercando di ordinare un array secondo due criteri contemporaneamente.
    Per prima cosa secondo il $value e secondariamente secondo la $key.

    Ipotiziamo un array fatto così:
    Codice PHP:
    $array = array ([35] => 1200, [22] => 1400, [122] => 4534, [12] => 4534); 
    se applico la funzione arsort() il risultato sarà il seguente:
    Codice PHP:
    $array = array ([122] => 4534, [12] => 4534, [22] => 1400, [35] => 1200); 
    ovvero ordinerà l'array a seconda del $value dei singoli elementi.
    A questo punto a me servirebbe che ordinasse anche per $key in modo tale che nel caso esistano 2 $value identici usi un criterio definito (ed eventualmente controllabile).

    Grazie in anticipo a chi avrà voglia e tempo di rispondermi.

    Ciao

  2. #2
    Potresti utilizzare http://www.php.net/uksort con una variabile globale oppure all'interno di una classe.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    7
    La funzione uksort() prende come argomenti un array e il callback di una function. Negli esempi i due valori utilizzati dalla funzione (valore $a e valore $b) corrispondono ad una coppia di $key.
    Potrebbe rivelarsi senz'altro utile se non fosse che le chiavi nel mio caso so già che saranno sempre diverse (saranno id di una tabella del DB), mentre il mio problema è controllare se i $value sono uguali e poi ordinare le $key di conseguenza dalla più bassa alla più alta.
    Dalla funzione che passo a uksort() non credo di poter gestire i $value dell'array che passo come primo parametro. Stessa cosa, al contrario, anche con la funzione usort() dove la funzione richiamata compara coppie di $value. Se trovassi infatti due $value uguali potrei agire sulle chiavi ed ordinarle? E poi dovrei fare una funzione ricorsiva per gestire più di due valori uguali contemporaneamente? Possibile non esista un metodo più easy?

    Quindi da questo array:
    Codice PHP:
    $array = array ([35] => 1200, [22] => 1400, [122] => 4534, [12] => 4534); 
    devo ottenere questo:
    Codice PHP:
    $array = array ([12] => 4534, [122] => 4534, [22] => 1400, [35] => 1200); 
    Altri consigli?

    Grazie!

  4. #4
    A me la soluzione indicata funziona perfettamente.

    Codice PHP:
    <pre>
    <?php 

    function custom_sort($a$b) {
        global 
    $array;

        if (
    $array[$a] > $array[$b]) {
            return -
    1;
        } elseif (
    $array[$a] < $array[$b]) {
            return 
    1;
        } else {
            if (
    $a $b) {
                return 
    1;
            } elseif (
    $a $b) {
                return -
    1;
            } else {
                return 
    0;
            }
        }
        
    }

    $array = array(35 => 120022 => 1400122 => 453412 => 4534);

    uksort($array"custom_sort");

    print_r($array);

    ?>
    </pre>

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    7
    Volevo evitare di utilizzare una global, ma considerato che così funziona userò un nome per la variabile un po' meno intuitivo di $array .

    Ti ringrazio davvero!

  6. #6
    Come già scritto, se non vuoi utilizzare global, implementa il metodo all'interno di una classe.

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    7
    Originariamente inviato da filippo.toso
    Come già scritto, se non vuoi utilizzare global, implementa il metodo all'interno di una classe.
    Hai perfettamente ragione ma si tratta di una modifica su un'applicazione già scritta e finita per gestire una specifica eccezione..
    Quindi è più veloce così e tanti saluti

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.