PHP动态父子嵌套数组指定ID节点名称修改方法
PHP嵌套父子数组修改指定ID节点名称并返回原结构
需求说明
给定一个包含唯一id、name的动态嵌套父子结构PHP数组,需根据指定的唯一ID定位到对应节点,修改其name值后,返回保持原有层级结构的完整数组。
示例数组
$array = [ [ "id" => "31350880", "name" => "HOD", "children" => [ [ "id" => "57f94cd7", "parent_id" => "31350880", "name" => "New HOD", "children" => [ [ "id" => "e7f1c88b", "parent_id" => "57f94cd7", "name" => "Gold", "children" => [] ] ] ] ] ], [ "id" => "45881fa8", "name" => "Pictures", "children" => [ [ "id" => "770e6e20", "parent_id" => "45881fa8", "name" => "New Picture", "children" => [ [ "id" => "a403a8fa", "parent_id" => "770e6e20", "name" => "Silver", "children" => [] ] ] ] ] ] ];
解决方案:递归遍历修改
利用递归遍历数组的每一个节点,匹配目标ID,找到后修改name值,同时保持原数组结构不变。
实现函数
function updateNodeName(&$array, $targetId, $newName) { foreach ($array as &$node) { // 匹配到目标节点,修改name if ($node['id'] === $targetId) { $node['name'] = $newName; return; } // 当前节点有子节点,递归遍历子节点 if (!empty($node['children'])) { updateNodeName($node['children'], $targetId, $newName); } } }
调用示例
比如要修改ID为770e6e20的节点名称为"Updated Picture":
// 调用函数修改节点 updateNodeName($array, '770e6e20', 'Updated Picture'); // 输出修改后的数组(可根据需求格式化输出) print_r($array);
修改后的输出结果
修改后,原数组结构保持不变,目标节点的name已更新:
Array ( [0] => Array ( [id] => 31350880 [name] => HOD [children] => Array ( [0] => Array ( [id] => 57f94cd7 [parent_id] => 31350880 [name] => New HOD [children] => Array ( [0] => Array ( [id] => e7f1c88b [parent_id] => 57f94cd7 [name] => Gold [children] => Array ( ) ) ) ) ) ) [1] => Array ( [id] => 45881fa8 [name] => Pictures [children] => Array ( [0] => Array ( [id] => 770e6e20 [parent_id] => 45881fa8 [name] => Updated Picture [children] => Array ( [0] => Array ( [id] => a403a8fa [parent_id] => 770e6e20 [name] => Silver [children] => Array ( ) ) ) ) ) ) )
说明
- 函数通过引用传递数组,避免复制整个大数组,提升效率;
- 递归会遍历所有层级的节点,无论目标节点在哪个层级都能找到;
- 因为ID是唯一的,找到目标节点后直接返回,无需继续遍历。
内容的提问来源于stack exchange,提问作者Adarsh Das
相关产品推荐
相关产品推荐

