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);
问题分析与解决方法
你的代码核心问题有两个:
array_values($products)是对整个外层数组重新索引,但实际需要重置索引的是内层的items子数组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
相关产品推荐
相关产品推荐

