Как предлагаете отсортировать такое?
$items = [
'item_a' => ['require' => ['item_b']],
'item_b' => ['require' => ['item_с']],
'item_c' => ['require' => ['item_a']],
];
Если циклов и взаимозависимостей не будет, тогда так:
foreach (array_keys($items) as $key) {
$items[$key]['name'] = $key;
}
uasort($items, function($a, $b) {
return (in_array($b['name'], $a['require']) || empty($b['require']));
});
https://ideone.com/ClHFqW
Для поиска циклических зависимостей у меня получилось такая функция:
/**
* @param array $items
* @return bool
*/
function search_cycle($items)
{
$search = function(array $path) use ($items, &$search)
{
$count = count($path);
$first = $path[0];
$last = $path[$count - 1];
if ($count > 1 && in_array($last, array_slice($path, 0, $count - 1))) {
return true;
}
foreach ($items[$last]['require'] as $key) {
if ($search(array_merge($path, [$key]))) {
return true;
}
}
return false;
};
foreach ($items as $key => $data) {
if ($search([$key])) {
return true;
}
}
return false;
}