Laravel PHP:如何向用户表data字段的嵌套数组指定位置插入元素
问题解决:在JSON数组指定位置插入子元素
问题说明
用户表的data字段存储如下JSON数据:
{"user": [["id", true], ["name", true], ["email", true], ["address", true], ["dob", true]], "prime_user": [["id", true], ["name", true], ["email", true], ["address", true], ["dob", true]], "premium_user": [["id", true], ["name", true], ["email", true], ["address", true], ["dob", true]]}
需求是在user、prime_user、premium_user每个子数组的["id", true]后插入元素["first_name", true],期望结果如下:
{ "user":[ ["id", true], ["first_name", true], ["name", true], ["email", true], ["address", true], ["dob", true] ], "prime_user":[ ["id", true], ["first_name", true], ["name", true], ["email", true], ["address", true], ["dob", true] ], "premium_user":[ ["id", true], ["first_name", true], ["name", true], ["email", true], ["address", true], ["dob", true] ] }
用户尝试以下代码但未生效:
$data = $user->data; $inserted = array("first_name", true); foreach ($data as $d) { array_splice($d, 1, 0, $inserted ); } $user->data = $data; $user->save();
问题根源
- foreach值传递导致修改无效:PHP中
foreach默认以值拷贝的方式遍历数组,循环内的$d是原数组元素的副本,修改$d不会影响原数组$data的内容。 - array_splice参数错误:
array_splice的第四个参数如果是数组,会将数组内的元素逐个插入;而我们需要插入的是整个["first_name", true]作为子数组,因此需要将该元素包裹在一个数组中传递。
修正后的代码
方法一:使用引用遍历
$data = $user->data; $inserted = ["first_name", true]; // 使用&符号将$d设为原数组元素的引用 foreach ($data as &$d) { // 将$inserted包裹在数组中,确保插入的是完整子数组 array_splice($d, 1, 0, [$inserted]); } // 遍历结束后销毁引用,避免后续变量污染 unset($d); $user->data = $data; $user->save();
方法二:通过键名修改原数组
$data = $user->data; $inserted = ["first_name", true]; foreach ($data as $key => $d) { array_splice($d, 1, 0, [$inserted]); // 将修改后的$d赋值回原数组对应键位 $data[$key] = $d; } $user->data = $data; $user->save();
验证说明
修正后的代码会:
- 正确遍历并修改原数组的每个子数组
- 在
["id", true]后插入完整的["first_name", true]子数组 - 保存修改后的JSON数据到用户表的
data字段
内容的提问来源于stack exchange,提问作者Rich
相关产品推荐
相关产品推荐

