Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    472

    problema con ordinamento

    Ho un array $a[$i] con $i=1,...,50.
    Ho un secondo array $b[$i] (idem).
    Voglio creare un terzo array chiamiamolo $a_ordinato[$i] con $i=1,..,50 dove le prime 45
    posizioni sono ordinate secondo $a e le dal 46° al 50°, visto che hanno tutte $a=0 dovrebbero essere ordinate secondo $b.
    Per ordinarle rispetto ad $a ho fatto rsort($a_ordinato) visto che mi serve l'ordine dal più grande al più piccolo.
    Ora spiego meglio l'ultimo pezzo di ordinamento. Poniamo che:
    $a[5]=0; $a[13]=0; $a[21]=0; $a[33]=0; $a[42]=0.
    (Tutti gli altri non menzionati hanno valore >0 e quindi hanno una posizione nell'array a_ordinato che va dalla 1 alla 45).
    Per il momento il comando rsort ha posizionato questi numeri in coda all'array ma io non li voglio con questo ordine ma da quello derivante da questa operazione:
    prendo i valori
    $b[5]=6; $b[13]=9; $b[21]=5; $b[33]=7; $b[42]=9.
    E quindi li voglio in ordine crescente in modo che
    $a_ordinato[46]=21
    $a_ordinato[47]=5
    $a_ordinato[48]=33
    $a_ordinato[49]=13
    $a_ordinato[50]=42
    A parità deve venire prima il numero d'ordine più basso.

    So per certo che gli indici che hanno valore 0 nel'array $a sono 5 e sempre 5.

    C'è un modo veloce per farlo? Spero di essere stato sufficientemente chiaro.
    Grazie.

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    472
    Scusate ho commesso un grosso errore.

    Il metodo per ordinare non è rsort, poichè l'ordinamento che voglio è questo. Faccio un esempio come se fossero solo 6 campi così si fa più facile:

    $a[1]=5;
    $a[2]=4;
    $a[3]=7;
    $a[4]=2;
    $a[5]=6;
    $a[6]=9;
    io vorrei che $a_ordinate fosse così:
    $a_ordinato[1]=6
    $a_ordinato[2]=3
    $a_ordinato[3]=5
    $a_ordinato[4]=1
    $a_ordinato[5]=2
    $a_ordinato[6]=4

  3. #3
    in che modo vuoi ordinare i dati dell'array?

    Crescente Decrescente Causale?

    Mi sembri un po' confuso:

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    472
    Non è che sono confuso...è che non mi sono spiegato bene....
    Vedi:
    $a[1]=5;
    $a[2]=4;
    $a[3]=7;
    $a[4]=2;
    $a[5]=6;
    $a[6]=9;
    io vorrei che $a_ordinate fosse così:
    $a_ordinato[1]=6
    $a_ordinato[2]=3
    $a_ordinato[3]=5
    $a_ordinato[4]=1
    $a_ordinato[5]=2
    $a_ordinato[6]=4
    $a_ordinato[1] vale 6 perché $a[6] ha il valore più alto (9);
    $a_ordinato[2] vale 3 perchè $a[3] ha il secondo valore più alto (7);
    $a_ordinato[3] vale 5 perché $a[5] ha il terzo valore più alto (6);
    ok?

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    472
    Per il momento lasciamo stare tutto ciò che ho scritto nel primo post che devo tutta rivederla...ho bisogno di quest'ordinamento...

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Originariamente inviato da mld
    Non è che sono confuso...è che non mi sono spiegato bene....
    Vedi:
    $a[1]=5;
    $a[2]=4;
    $a[3]=7;
    $a[4]=2;
    $a[5]=6;
    $a[6]=9;
    io vorrei che $a_ordinate fosse così:
    $a_ordinato[1]=6
    $a_ordinato[2]=3
    $a_ordinato[3]=5
    $a_ordinato[4]=1
    $a_ordinato[5]=2
    $a_ordinato[6]=4
    $a_ordinato[1] vale 6 perché $a[6] ha il valore più alto (9);
    $a_ordinato[2] vale 3 perchè $a[3] ha il secondo valore più alto (7);
    $a_ordinato[3] vale 5 perché $a[5] ha il terzo valore più alto (6);
    ok?
    Codice PHP:
    <?php
    function cmp($a$b
    {
        if (
    $a == $b) {
            return 
    0;
        }
        return (
    $a $b) ? : -1;
    }
    $array = array(1=>5,4,7,2,6,9);
    uasort($array,"cmp");
    $ordinato =array_flip($array);
    $ordinato array_reverse(array_reverse($ordinato));
    print_r($ordinato);
    ?>

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    472
    Questo va bene, però sorge un problema quando ci sono due valori uguali.
    Infatti su questo array, ad esempio:

    Array ($a)
    (
    [0] => 30
    [1] => 30
    [2] => 10
    [3] => 40
    )
    dà questo risultato
    Array
    (
    [0] => 3
    [1] => 0
    [2] => 2
    )
    e ciò non va bene.

    Vorrei che quando il valore è uguale, si tenesse conto dell'array $b .

    Mi spiego meglio.
    Prendiamo sempre questo esempio con $a[0]=30 e $a[1]=30 dovrebbero essere
    ordinati a seconda dei valori dell'array $b, poniamo che $b[0]=12 e $b[1]=15 allora 0 dovrebbe precedere 1.

    E quindi $ordinato dovrebbe essere
    Array
    (
    [0] => 3
    [1] => 0
    [2] => 1
    [3] => 2
    )


    In pratica come linea di base va bene la funzione cmp che hai creato, però quando vi sono delle "parità" vorrei che fossero gestite attraverso i valori dell'array $b e precisamente in senso crescente.

  8. #8
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Codice PHP:
    <?php
    function cmp($a$b
    {
        if (
    $a == $b) {
            return 
    0;
        }
        return (
    $a $b) ? : -1;
    }
    $array = array(30,30,10,40,40,31);
    echo 
    '<pre>';
    print_r($array);

    uasort($array,"cmp");
    print_r($array);

    $ordinato =array_keys($array);
    print_r($ordinato);
    ?>

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    472
    Ok adesso gestisce le "parità".

    Da questo array

    Array
    (
    [0] => 30
    [1] => 30
    [2] => 10
    [3] => 10
    [4] => 50
    )

    si arriva a questo:

    Array
    (
    [0] => 4
    [1] => 0
    [2] => 1
    [3] => 2
    [4] => 3
    )

    però io non voglio che me le metta in questo ordine. Cioè in questo caso ci sono 2 parità: fra lo 0 e l'1 e fra il 2 e il 3 e nell'ordinamento mi mette lo 0 prima dell'1 e il 2 prima del 3.
    Io vorrei invece che in questi casi facesse riferimento a un terzo array $b che contiene anch'esso tanti elementi quanti quelli di $a.
    E quindi per decidere chi mettere prima fra 0 e 1 andasse a vedere $b[0] e $b[1] e mettesse prima il min($b[0],$b[1]) e lo stesso fra il 2 e il 3.
    Bisogna considerare che possono essere fino a 5 elementi in "parità". E se sono 5 bisogna sempre far riferimento ai valori di $b. [A parità ancora di $b allora va bene l'ordine naturale cioè 1 precede 2 che precede 3 e così via...]
    Mi sono spiegato?

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    472
    Sono stato sufficientemente chiaro? Faccio un esempio limitatamente a 11 posizioni:

    $a[0]=5;
    $a[1]=3;
    $a[2]=6;
    $a[3]=9;
    $a[4]=3;
    $a[5]=5;
    $a[6]=7;
    $a[7]=1;
    $a[8]=6;
    $a[9]=2;
    $a[10]=5;

    $b[0]=15;
    $b[1]=17;
    $b[2]=14;
    $b[3]=14;
    $b[4]=16;
    $b[5]=15;
    $b[6]=13;
    $b[7]=14;
    $b[8]=16;
    $b[9]=15;
    $b[10]=18;

    Ecco come vorrei l'array ordinato e di seguito spiegato il motivo:

    $ordinato[0]=3; ($a[3]=9 è il valore più alto)
    $ordinato[1]=6; ($a[6]=7 è il secondo valore più alto)
    $ordinato[2]=2; ($a[2]=6 e anche $a[8]=6. Allora si guardano i valori di $b[2] e di $b[8] che
    sono rispettivamente 14 e 16 e si prendono in ordine crescente.

    $ordinato[3]=8; (idem)
    $ordinato[4]=0; ($a[0]=5 ma anche $a[5] e $a[10] sono uguale a 5 allora si guardano i
    valori dei rispettivi $b e si mettono in ordine crescente. $b[0] e $b[5]
    valgono entrambi 15 e allora si mettono in ordine naturale; terzo viene il 10
    perché $b[10] vale 18.
    $ordinato[5]=5; (idem)
    $ordinato[6]=10; (idem)
    $ordinato[7]=4; ($a[1]=3 e anche $a[4]=3; si guardano i rispettivi valori di $b che sono
    17 e 16 quindi 4 precede 1.
    $ordinato[8]=1; (idem)
    $ordinato[9]=9; (c'è solo lui con $a[9]=2)
    $ordinato[10]=7; (c'è solo lui con $a[7]=1).

    Spero di essere stato chiaro...

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.