Laravel使用session pull删除会话数组项后如何重排连续数字键
解决Laravel会话删除数组项后索引非连续问题
问题原因
你当前使用session()->pull('table'.$id_meja.'.'.$i)的删除逻辑,底层等价于对对应路径的数组执行unset操作。PHP原生数组在执行unset删除中间元素时,不会自动重整数字索引,因此会出现删除索引1后,剩余元素保留原键值0、2的非连续结构。
实现连续索引的修改逻辑
要达成0、1连续数字索引的效果,只需要在完成元素删除后,对当前桌号对应的会话数组做一次重排再写回即可,核心用到PHP内置的array_values()方法——该方法会忽略原数组的所有键名,按值的先后顺序重新生成从0开始的连续整数索引。
具体修改后的代码如下:
$items = session('table'.$id_meja); $count = count($items); for($i=0; $i<$count; $i++){ if($items[$i]['id_items'] == $id_item){ // 删除匹配的目标数组项 session()->pull('table'.$id_meja.'.'.$i); // 取出删除后的不连续数组,重排为连续索引结构 $continuousItems = array_values(session('table'.$id_meja)); // 将重排后的数组覆盖写入对应会话键 session()->put('table'.$id_meja, $continuousItems); // 匹配到目标项后及时跳出循环,减少无意义遍历 break; } } dd(session()->all());
效果校验
执行修改后的代码后,原0、2的非连续结构会被重排为从0开始的连续数字索引,最终输出结构类似:
"table4" => array:2 [ 0 => array:6 [...] 1 => array:6 [...] ]
注意点
- 匹配到目标物品完成操作后要及时
break跳出循环,避免在数组已经更新的情况下继续遍历原计数范围的元素 - 重排操作必须在元素删除完成后执行,否则会把还未删除的原数组直接重排,达不到预期效果
- 重排纯数字索引数组时优先使用
array_values(),不要用其他会触发索引偏移的数组处理函数,避免出现值错位问题
内容的提问来源于stack exchange,提问作者blckaddict02
相关产品推荐
相关产品推荐

