[PHP] ordinare un array multidimensionale in modo personalizzato

perseoclub

Utente Attivo
28 Nov 2015
92
0
6
Buongiorno,

ho bisogno del vostro aiuto per risolvere questo problema.

Ho creato un array (multidimensionale) e avrei bisogno di ordinarlo in base a criteri personalizzati.

Se io avessi un array così:
PHP:
$array = array(
    'PERSONA_1' => array(
        'ID' => 1
        'NOME' => 'HOMER'
        'ID_FIGLIO' => 2
    ),
    'PERSONA_2' => array(
        'ID' => 2
        'NOME' => 'BURT'
        'ID_FIGLIO' => null
    ),
    'PERSONA_3' => array(
        'ID' => 3
        'NOME' => 'LIZA'
        'ID_FIGLIO' => null
    ), 
    'PERSONA_4' => array(
        'ID' => 4
        'NOME' => 'NED'
        'ID_FIGLIO' => null
    )
    'PERSONA_5' => array(
        'ID' => 5
        'NOME' => 'MARGIE'
        'ID_FIGLIO' => 3
    ),
    'PERSONA_6' => array(
        'ID' => 6
        'NOME' => 'Mr. BURNS'
        'ID_FIGLIO' => null
    ),
    'PERSONA_7' => array(
        'ID' => 7
        'NOME' => 'BOE'
        'ID_FIGLIO' => null
    )
);

Vorrei ordinare l'array in modo tale che la sequenza restituita sia (CHI HA FIGLI.. IL/I FIGLIO/I.. e POI CHI NON LI HA):

HOMER, BURT, MARGIE, LIZA, NED, Mr.BURNS, BOE..

PS: In questo esempio non tengo conto che BURT è anche figlio di MARGIE e LIZA (forse) di HOMER.. :D
 
Ultima modifica:
Ciao,
Come fai a capire se la persona è Padre o Figlio?
Non conviene fare con mysqli una semplice tabella e risolvi in meno di 10 secondi facendo una semplicissima query?
 
Ciao,

il Figlio (non ha altri figli) ha ID_FIGLIO = null

Potrei anche optare via DB, ma volevo fare pratica con gli array. Comunque ho risolto.. iterando l'array ...e riscrivendo un nuovo array ordinato con degli IF... La classiva "via procedurale"...

Per il momento mi soddisfa.. ma visto che il bug è dietro l'angolo, dovrò testarlo per un po' prima di cantare vittoria.

Invece una cosa non mi è chiara..

Volendo ordinare un array seguendo una lista pre-ordinata ho scoperto la funzione essere simile a questa:
PHP:
$order = array(1,5,8,2,9,15); // ORDINE PREDEFINITO DEGLI ID

usort( $tests_ok, function ($a, $b) use ( $order ) {

    if ( in_array( $a['ID'], $order ) ){

        $pos_a = array_search( $a['ID'], $order );
        $pos_b = array_search( $b['ID'], $order );

        $rsl = $pos_a - $pos_b;

     }

    return $rsl;

});

Come faccio ad essere sicuro che gli array con gli ID esclusi da $order vengano messi in maniera crescente dopo l'ultimo ID (il 15)?

cioè:

$order = array(1,5,8,2,9,15);

..se io ho una sequenza 1,2,4,5,7,8,14,15,16,ecc.. vorrei ottenere questo ordine..

1,5,8,2,15,4,7,14,16,ecc..

E' possibile? Io ho pensato questa soluzione..

Ordino tutta la mia sequenza in ordine crescente.. Se l'ID è in $order.. $ordinalo.. se non lo è inseriscilo in un nuovo array..

Alla fine avrò due array che devo unire.. il primo (ordinato con la mia sequenza) con il secondo (quello creato per esclusione).

Che ne pensate?
 

Discussioni simili