PHP如何将路径字符串转为多维数组键并替换id对应值
方法1:递归遍历过程中直接修改(推荐)
不需要额外解析路径,直接在现有递归逻辑基础上给数组加引用传递,找到id时直接赋值即可,性能更高也不易出错。
修改后代码如下:
$arr = json_decode($json, true); // 你的id映射表,存储旧id到新id的对应关系 $idMap = [ '1141159925645373' => 'new_id_1', '1141168515579912' => 'new_id_2', // 补充其余映射规则 ]; function arrayFind($path, &$a, $idMap) { foreach ($a as $k => &$v) { // $v加&标记为引用,修改时直接作用于原数组 if (is_array($v)){ $p = $path === "" ? $k : $path . "|" . $k; arrayFind($p, $v, $idMap); } else { if ($k === "id") { // 查表替换值 if (isset($idMap[$v])) { $a[$k] = $idMap[$v]; } // 可保留原有输出逻辑 // echo $path . "|" . $k . " => " . $a[$k] . "\n"; } } } // 解除引用,避免后续逻辑意外污染数组 unset($v); } arrayFind("", $arr, $idMap); // 此时$arr已经是id替换完成的数组,直接使用即可
方法2:解析现有路径字符串修改
如果你确实需要将已生成的|分隔路径转换为数组访问形式,可通过引用逐层遍历路径片段实现,不要使用eval避免安全风险:
直接修改原数组的实现:
// 示例路径和要设置的新值 $pathStr = "6|staffAssignments|0|ids|0|id"; $newId = "your_new_id"; function setValueByPath(&$arr, string $pathStr, $newValue, string $delimiter = '|'): bool { $keyList = explode($delimiter, $pathStr); $current = &$arr; foreach ($keyList as $key) { // 可根据需求增加键不存在的异常处理 if (!isset($current[$key])) { return false; } $current = &$current[$key]; } $current = $newValue; unset($current); return true; } // 调用即可修改原数组对应路径的值 setValueByPath($arr, $pathStr, $newId);
生成字面量代码字符串的实现:
如果需要输出类似$arr[6]["staffAssignments"][0]["ids"][0]["id"] = "newValue"的代码字符串,可按如下方式处理:
$pathStr = "6|staffAssignments|0|ids|0|id"; $keyList = explode('|', $pathStr); $code = '$arr'; foreach ($keyList as $key) { $code .= is_numeric($key) ? "[$key]" : '["' . addslashes($key) . '"]'; } $code .= ' = "newValue";'; // 输出结果即为你需要的字面量代码 echo $code;
内容的提问来源于stack exchange,提问作者user3231130
相关产品推荐
相关产品推荐

