如何修改PHP函数,在更新步骤顺序时同步更新父节点值?
修改PHP函数同步更新步骤的order与parent值
现有updateOrderAndParent函数可根据$newStepOrder参数(当前值为[1613 => 3])更新所有步骤的order值,现需修改该函数,使其在更新步骤顺序的同时同步更新所有步骤的parent值,最终输出需匹配指定数组结构。
原函数代码
function updateOrderAndParent() { $existingStepsOrder = [ 1612 => [ 'order' => 1, 'parent' => null, 'id' => 1612, ], 1613 => [ 'order' => 2, 'parent' => 1612, 'id' => 1613, ], 1614 => [ 'order' => 3, 'parent' => 1613, 'id' => 1614, ], ]; $newStepOrder = [1613 => 3]; // 遍历新顺序数组中的每个ID(按顺序值排序) foreach ($newStepOrder as $id => $newOrder) { // 获取该ID在现有步骤数组中的当前顺序 $currentOrder = $existingStepsOrder[$id]['order']; // 如果当前顺序小于新顺序,将当前到新顺序之间的所有值下移一位 if ($currentOrder < $newOrder) { for ($i = $currentOrder; $i < $newOrder; ++$i) { $orders = array_column($existingStepsOrder, 'order', 'id'); $currentId = array_search($i + 1, $orders); --$existingStepsOrder[$currentId]['order']; } } // 如果当前顺序大于新顺序,将当前到新顺序之间的所有值上移一位 if ($currentOrder > $newOrder) { for ($i = $currentOrder; $i > $newOrder; --$i) { $orders = array_column($existingStepsOrder, 'order', 'id'); $currentId = array_search($i - 1, $orders); ++$existingStepsOrder[$currentId]['order']; } } // 更新该ID在现有步骤数组中的顺序为新顺序 $existingStepsOrder[$id]['order'] = $newOrder; } return $existingStepsOrder; }
期望输出数组
[ 1612 => [ 'order' => 1, 'parent' => null, 'id' => 1612, ], 1613 => [ 'order' => 3, 'parent' => 1614, 'id' => 1613, ], 1614 => [ 'order' => 2, 'parent' => 1612, 'id' => 1614, ] ];
修改后的函数代码
function updateOrderAndParent() { $existingStepsOrder = [ 1612 => [ 'order' => 1, 'parent' => null, 'id' => 1612, ], 1613 => [ 'order' => 2, 'parent' => 1612, 'id' => 1613, ], 1614 => [ 'order' => 3, 'parent' => 1613, 'id' => 1614, ], ]; $newStepOrder = [1613 => 3]; // 保留原有order调整逻辑 foreach ($newStepOrder as $id => $newOrder) { $currentOrder = $existingStepsOrder[$id]['order']; if ($currentOrder < $newOrder) { for ($i = $currentOrder; $i < $newOrder; ++$i) { $orders = array_column($existingStepsOrder, 'order', 'id'); $currentId = array_search($i + 1, $orders); --$existingStepsOrder[$currentId]['order']; } } if ($currentOrder > $newOrder) { for ($i = $currentOrder; $i > $newOrder; --$i) { $orders = array_column($existingStepsOrder, 'order', 'id'); $currentId = array_search($i - 1, $orders); ++$existingStepsOrder[$currentId]['order']; } } $existingStepsOrder[$id]['order'] = $newOrder; } // 按order值升序排序步骤,便于构建parent关联 usort($existingStepsOrder, function($a, $b) { return $a['order'] - $b['order']; }); // 重新设置每个步骤的parent值 $totalSteps = count($existingStepsOrder); for ($i = 0; $i < $totalSteps; $i++) { $currentStep = &$existingStepsOrder[$i]; // 第一个步骤parent为null,后续步骤的parent是前一个步骤的id $currentStep['parent'] = $i === 0 ? null : $existingStepsOrder[$i - 1]['id']; } // 恢复为以步骤ID为键的原数组结构 $result = []; foreach ($existingStepsOrder as $step) { $result[$step['id']] = $step; } return $result; }
修改说明
- 保留原函数的
order调整逻辑,确保步骤顺序正确更新 - 使用
usort将调整后的步骤按order值升序排列,便于构建parent层级关联 - 遍历排序后的数组,为每个步骤设置
parent:第一个步骤的parent为null,后续每个步骤的parent为前一个步骤的id - 最后将排序后的数组恢复为以步骤ID为键的结构,保证输出格式与原数组一致
内容的提问来源于stack exchange,提问作者deepsingh
相关产品推荐
相关产品推荐

