PHP:如何更新对象数组中不匹配的reference属性及数组键?
问题描述
我有一个对象数组,其中部分元素的reference属性与code_cip属性不相等,示例数组如下:
Array ( [9921279] => lignecatalogue Object ( [id] => 3013181 [reference] => 9921279 [commentaire] => [code_cip] => 9884064 ) [9884064] => lignecatalogue Object ( [id] => 3013193 [reference] => 9884064 [commentaire] => [code_cip] => 9884064 ) )
需要实现:仅当对象的reference与code_cip不相等时,将该对象的reference更新为code_cip,同时更新数组中对应元素的键(不删除整个元素)。
目前已写出部分判断代码,但不清楚后续操作:
$arrLigneCats = getAllCat(); //returns above array foreach($arrLigneCats as $ligneCat) { if ($ligneCat->code_cip != $ligneCat->reference) { $reference = $ligneCat->reference; } else { $reference = $ligneCat->code_cip; } }
请问如何在不删除整个元素的前提下替换数组的键?
解决方案
方法一:直接修改原数组(带引用遍历)
要实现需求,需同时处理对象属性更新和数组键替换,直接遍历原数组时需注意避免遍历异常,代码如下:
$arrLigneCats = getAllCat(); // 遍历数组,同时获取旧键和对象引用 foreach($arrLigneCats as $oldKey => &$ligneCat) { if ($ligneCat->code_cip !== $ligneCat->reference) { // 更新对象的reference属性为code_cip $ligneCat->reference = $ligneCat->code_cip; $newKey = $ligneCat->code_cip; // 添加新键到数组,保留对象 $arrLigneCats[$newKey] = $ligneCat; // 删除旧键 unset($arrLigneCats[$oldKey]); } } // 解除对象引用,防止后续误操作 unset($ligneCat);
关键细节
- 使用
&$ligneCat引用对象,修改属性时直接作用于原数组中的对象; - 先添加新键再删除旧键,确保元素不会丢失;
- 用
!==严格比较类型和值,避免类型差异导致的错误匹配。
方法二:创建新数组(更安全简洁)
如果担心修改原数组结构影响遍历,可直接构建新数组存储处理后的结果:
$arrLigneCats = getAllCat(); $processedArr = []; foreach($arrLigneCats as $ligneCat) { // 仅当属性不等时更新reference if ($ligneCat->code_cip !== $ligneCat->reference) { $ligneCat->reference = $ligneCat->code_cip; } // 用code_cip作为新键存入新数组 $processedArr[$ligneCat->code_cip] = $ligneCat; } // 若需要保留原变量名,替换原数组 $arrLigneCats = $processedArr;
这种方式逻辑更清晰,不会出现遍历异常,适合大多数场景。
内容的提问来源于stack exchange,提问作者Rohan
相关产品推荐
相关产品推荐

