2015-12-11 11 views
6

Desidero ordinare l'array in base ai valori figlio, voglio matrice figlio padre in prima posizione quindi suo figlio e poi suo figlio maggiore e così via ... in base al valore "Parent" qui è il mio esempio array,Ordina matrice figlio dipendente in php

$array= Array( 
      Array("self"=>"user4", "parent"=>"user6"), 
      Array("self"=>"user2", "parent"=>"user1"), 
      Array("self"=>"user1", "parent"=>"user4"), 
      Array("self"=>"user5", "parent"=>"user2"), 
      Array("self"=>"user6", "parent"=>"user3"), 
      Array("self"=>"user3", "parent"=>"Parent") // it will be anything 
     ); 

questo array deve essere ordinato come qui di seguito

Array(
[0] => Array 
    (
     [self] => user3 
     [parent] => Parent 
    ) 

[1] => Array 
    (
     [self] => user6 
     [parent] => user3 
    ) 

[2] => Array 
    (
     [self] => user4 
     [parent] => user6 
    ) 

[3] => Array 
    (
     [self] => user1 
     [parent] => user4 
    ) 

[4] => Array 
    (
     [self] => user2 
     [parent] => user1 
    ) 

[5] => Array 
    (
     [self] => user5 
     [parent] => user2 
    )) 
+0

Non hai menzionato un pattern. Per favore aggiungi un codice di output effettivo in modo da poterlo suggerire. Al momento non è chiaro se lo si ordina sul valore figlio o sul valore padre. –

+0

@ rajausman haider, sto ordinando in base ai valori dei genitori, può essere qualsiasi cosa, se quel genitore si riferisce a qualsiasi figlio, allora dovrebbe venire dopo il genitore, in pratica è un modello figlio genitore. – Sanjay

+0

Un articolo può avere più di un figlio? – santaka

risposta

3

Si può usare nel modo seguente:

$array= Array( 
      Array("self"=>"user4", "parent"=>"user6"), 
      Array("self"=>"user2", "parent"=>"user1"), 
      Array("self"=>"user1", "parent"=>"user4"), 
      Array("self"=>"user5", "parent"=>"user2"), 
      Array("self"=>"user6", "parent"=>"user3"), 
      Array("self"=>"user3", "parent"=>"Parent") // it will be anything 
     ); 
$result = ""; 
foreach($array as $val) 
{ 
    if($val['parent']== 'Parent') 
    { 
     $result[] = $val; 
     getNextNode($val['self']); 
    } 
} 
function getNextNode($child) 
{ 
    global $array; 
    global $result; 
    foreach($array as $val) 
    { 
     if($val['parent'] == $child) 
     { 
      $result[] = $val; 
      getNextNode($val['self']); 
     } 
    } 
} 
echo "<pre/>"; 
print_r($result); 

Si ottiene il risultato desiderato.

+0

Non penso che sia necessario farlo se PHP fornisce funzioni come * usort * –

2

prega di dare un'occhiata Topological Sorting. Può essere utile per voi

+1

i collegamenti possono essere commentati non può essere una risposta –

2

In genere quando è necessario ordinare qualcosa in PHP in modo non banale, è necessario utilizzare una funzione di ordinamento definita dall'utente (http://php.net/manual/es/function.usort.php), come questa. Si noti che se si desidera conservare gli indici di array, è necessario utilizzare la funzione uasort invece della funzione usort. Ciò manterrà il tuo codice breve e pulito.

function cmp($a, $b) { 
    if($a['parent'] == 'Parent' || $a['self'] == $b['parent']) 
     return -1; 
    if($b['parent'] == 'Parent' || $b['self'] == $a['parent']) 
     return 1; 
    return 0; 
} 

$array= Array( 
     Array("self"=>"user4", "parent"=>"user6"), 
     Array("self"=>"user2", "parent"=>"user1"), 
     Array("self"=>"user1", "parent"=>"user4"), 
     Array("self"=>"user5", "parent"=>"user2"), 
     Array("self"=>"user6", "parent"=>"user3"), 
     Array("self"=>"user3", "parent"=>"Parent") // it will be anything 
    ); 

usort($array, 'cmp'); 
print_r($array); 

Qui il user che non ha un genitore è definito con un "genitore", come parent, ma potrebbe essere qualcosa di simile a false nel qual caso è sufficiente aggiornare la funzione cmp conseguenza.

Ci scusiamo per la formattazione, è davvero difficile per il telefono. Non esitate a modificarlo.