
本文介绍如何遍历对象数组,仅当对象的 reference 属性不等于其 code_cip 属性时,将其 reference 更新为 code_cip 的值,并说明关键误区与正确写法。
本文介绍如何遍历对象数组,仅当对象的 `reference` 属性不等于其 `code_cip` 属性时,将其 `reference` 更新为 `code_cip` 的值,并说明关键误区与正确写法。
在 PHP 中处理对象数组时,一个常见误区是:误将局部变量赋值(如 $reference = ...)当作对对象属性的修改。实际上,对象在 foreach 循环中默认以值传递方式(即对象引用的副本)被遍历——但只要该对象未被显式复制(如用 clone),对 $ligneCat->reference 的直接赋值仍会作用于原数组中的对应对象。
根据你提供的数据结构:
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 的值(如第一个元素需从 9921279 → 9884064),而无需、也不应修改数组键名本身(键名 9921279 和 9884064 是独立索引,与业务逻辑无关)。
✅ 正确实现如下:
立即学习“PHP免费学习笔记(深入)”;
$arrLigneCats = getAllCat(); // 获取原始对象数组
foreach ($arrLigneCats as $ligneCat) {
if ($ligneCat->code_cip !== $ligneCat->reference) {
$ligneCat->reference = $ligneCat->code_cip;
}
}
// 此时 $arrLigneCats 中的对象属性已被原地更新⚠️ 注意事项:
-
不要使用
==进行比较:推荐使用严格比较!==,避免因类型隐式转换(如字符串'9884064'与整数9884064)导致误判; - 无需重新索引或重建数组:PHP 对象是引用语义(内部 handle 共享),直接修改属性即可生效;
-
若需同时更新键名(虽非本题需求,但易混淆):则必须重建数组,例如:
$newArray = []; foreach ($arrLigneCats as $key => $obj) { if ($obj->code_cip !== $obj->reference) { $obj->reference = $obj->code_cip; } $newArray[$obj->reference] = $obj; // 以新 reference 为键 } $arrLigneCats = $newArray; -
确保对象属性可写:确认
lignecatalogue类中reference是 public 属性,或提供__set()/setter 方法;若为 private/protected 且无访问器,需改用setReference()等方法。
总结:核心在于理解「修改对象属性」与「修改变量值」的本质区别。你的原始代码中 $reference = ... 只是覆盖了临时变量,对原对象毫无影响;而 $ligneCat->reference = ... 才真正触达并更新了源数据。这是面向对象 PHP 开发中必须厘清的基础概念。



















