删除嵌套数组元素后顶级键被篡改的问题求助
问题分析与解决方案
你遇到的问题核心是丢失了原数组的顶级键结构。让我拆解一下:
在你的代码里,你直接把$cur_tokens替换成了$cur_tokens['enu']这个子数组,修改后又直接把这个子数组存回数据库——这就相当于你丢弃了原来的['enu' => [...]]外层结构,自然剩下的元素会变成数字索引的数组。
修正后的代码
// 获取完整的tokens数组 $cur_tokens = get_option('custom_tokens'); // 先确认enu分类存在,避免报错 if (isset($cur_tokens['enu'])) { // 把enu子数组存到临时变量,不要直接覆盖原数组 $enu_tokens = $cur_tokens['enu']; // 遍历临时变量找要删除的元素 foreach ($enu_tokens as $key => $cur) { if (isset($_POST['token-' . $key])) { // 删除指定元素 unset($enu_tokens[$key]); // 重新索引数组(可选,如果你希望保持数字索引连续) $enu_tokens = array_values($enu_tokens); // 将修改后的子数组放回原数组的enu键下 $cur_tokens['enu'] = $enu_tokens; // 更新完整的数组到数据库 update_option('custom_tokens', $cur_tokens); // 找到要删除的元素后可以跳出循环,避免重复执行 break; } } }
关键修正点
- 保留原数组结构:不再直接覆盖
$cur_tokens,而是用临时变量操作子数组,修改后再放回原数组的对应键位 - 可选的重新索引:使用
array_values()可以让删除后的子数组保持连续的数字索引(如果不需要可以去掉这一步) - 存在性检查:先确认
$cur_tokens['enu']存在,避免出现Undefined index的错误
额外提示
如果删除后$enu_tokens变成空数组,你可以选择保留['enu' => []]的结构,或者根据需求删除整个enu键:
// 如果子数组为空,删除顶级键 if (empty($enu_tokens)) { unset($cur_tokens['enu']); }
内容的提问来源于stack exchange,提问作者MakingStuffs
相关产品推荐
相关产品推荐

