You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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;
}

修改说明

  1. 保留原函数的order调整逻辑,确保步骤顺序正确更新
  2. 使用usort将调整后的步骤按order值升序排列,便于构建parent层级关联
  3. 遍历排序后的数组,为每个步骤设置parent:第一个步骤的parent为null,后续每个步骤的parent为前一个步骤的id
  4. 最后将排序后的数组恢复为以步骤ID为键的结构,保证输出格式与原数组一致

内容的提问来源于stack exchange,提问作者deepsingh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 01:22:44