Array di ordine PHP basato sulla dipendenza degli elementi

È abbastanza difficile da spiegare, ma in effetti ho una serie di elementi con ID, che possono contenere un elenco di ID per altri elementi dell'arrays. per esempio

$items = [ [id: 'one', deps: ['three']], [id: 'two'], [id: 'three', deps: ['four', 'two']], [id: 'four'] ]; 

Quindi, come puoi vedere qui, uno dipende da tre e tre dipende da quattro e due.

Ho bisogno di get un nuovo arrays, che contenga questi elementi in ordine – in modo che le dependencies siano elencate in ordine. Quindi la matrix di cui sopra si convertirà in

 $items = [ [id: 'four'], [id: 'two'], [id: 'three', deps: ['four', 'two']], [id: 'one', deps: ['three']] ]; 

Come potrei completare questo? Ho provato vari loops while durante il controllo delle posizioni degli articoli, ma non posso romperlo.

Grazie

AGGIORNARE Alcune persone hanno detto che è una domanda duplicata di THIS, ma la principale differenza è che l'esempio precedente ha più dependencies – mentre il thread menzionato funziona solo su una singola string di dipendenza

puoi usare una function come questa, che itera fino a quando tutte le dependencies sono soddisfatte, o non è ansible risolvere altre dependencies:

 $items = arrays(arrays('id' => 'one', 'deps' => arrays('three')), arrays('id' => 'two'), arrays('id' => 'three', 'deps' => arrays('four', 'two')), arrays('id' =>'four')); $sortedItems = sortDeps($items); var_dump($sortedItems); function sortDeps($items) { $res = arrays(); $doneList = arrays(); // while not all items are resolved: while(count($items) > count($res)) { $doneSomething = false; foreach($items as $itemIndex => $item) { if(isset($doneList[$item['id']])) { // item already in resultset continue; } $resolved = true; if(isset($item['deps'])) { foreach($item['deps'] as $dep) { if(!isset($doneList[$dep])) { // there is a dependency that is not met: $resolved = false; break; } } } if($resolved) { //all dependencies are met: $doneList[$item['id']] = true; $res[] = $item; $doneSomething = true; } } if(!$doneSomething) { echo 'unresolvable dependency'; } } return $res; }