gpt4 book ai didi

PHP Order数组基于元素依赖

转载 作者:行者123 更新时间:2023-12-04 12:50:25 25 4
gpt4 key购买 nike

很难解释,但实际上我得到了一组具有 ID 的项,其中可以包含其他数组项的 ID 列表。例如

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

因此,正如您在这里看到的,一取决于三,三取决于四和二。

我需要获取一个新数组,其中按顺序包含这些项 - 以便按顺序列出依赖项。所以上面的数组会转换成

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

我将如何完成这个?我尝试了各种 while 循环检查项目位置,但无法破解。

谢谢

更新 有些人说这是THIS 的重复问题但主要区别在于上面的示例具有多个依赖项 - 而提到的线程仅适用于单个字符串依赖项

最佳答案

您可以使用这样的函数,它会迭代直到满足所有依赖关系,或者无法解决更多依赖关系:

$items = array(array('id' => 'one', 'deps' => array('three')),
array('id' => 'two'),
array('id' => 'three', 'deps' => array('four', 'two')),
array('id' =>'four'));


$sortedItems = sortDeps($items);
var_dump($sortedItems);

function sortDeps($items) {
$res = array();
$doneList = array();

// 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;
}

关于PHP Order数组基于元素依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39711720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com