You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中移除多维数组元素并重置子数组键名的实现方案

问题:多维数组指定元素删除并重新索引

原数组结构

Array ( 
[items] => Array ( 
  [0] => Array ( [product_id] => 16073 [product_name] => product one ) 
  [1] => Array ( [product_id] => 19137 [product_name] => product two ) 
  [2] => Array ( [product_id] => 19143 [product_name] => product three ) 
) 

需求

删除指定product_id对应的元素(例如移除product_id=19137的元素),删除后保持数组结构不变,且内层items数组的索引从0开始连续,得到如下结果:

Array ( 
[items] => Array ( 
  [0] => Array ( [product_id] => 16073 [product_name] => ARMANI EXCHANGE Rectangular Sunglasses, AX2029S [url] => url_1) 
  [1] => Array ( [product_id] => 19143 [product_name] => OLIVER PEOPLES L.A. Rectangular Sunglasses, OV1289S  [url] => url_2) 
) 

用户现有代码

$productId = $this->request->getParam('product_id');
$customerSessionData = $this->customerModelSessionFactory->create();
$products = $customerSessionData->getHtoProducts(); 
foreach($products['items'] as $key  => $product){
    if($product['product_id'] == $productId){
        unset($products['items'][$key]);
        $product_name = $product['product_name'];
        
    }
}
array_values($products); print_r($products);
$customerSessionData->setHtoProducts($products);

问题分析与解决方法

你的代码核心问题有两个:

  1. array_values($products) 是对整个外层数组重新索引,但实际需要重置索引的是内层的items子数组
  2. array_values的返回值没有赋值回原数组,等于没有生效

修正后的代码如下:

$productId = $this->request->getParam('product_id');
$customerSessionData = $this->customerModelSessionFactory->create();
$products = $customerSessionData->getHtoProducts(); 

foreach($products['items'] as $key  => $product){
    if($product['product_id'] == $productId){
        unset($products['items'][$key]);
        $product_name = $product['product_name'];
        // 找到目标元素后提前退出循环,提升效率
        break;
    }
}

// 仅对items子数组重新索引,并赋值回原数组
$products['items'] = array_values($products['items']);

print_r($products);
$customerSessionData->setHtoProducts($products);

关键说明

  • 使用unset删除元素后,内层items数组的索引会出现断层(比如删除索引1后,剩下0和2)
  • array_values($products['items'])可以重置子数组的索引,让它从0开始连续排列
  • 必须将array_values的结果赋值回$products['items'],否则修改不会生效
  • 加入break提前终止循环,避免不必要的遍历操作

内容的提问来源于stack exchange,提问作者Mujahidh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 13:41:13