本文详解如何正确将数据库查询返回的 stdclass 对象数组转换为可操作的 php 关联数组,并高效去除重复项,避免“cannot use object of type stdclass as array”错误。
在 PHP 中,使用 PDO 或 MySQLi 执行 SQL 查询后,若调用 fetch_all(PDO::FETCH_OBJ) 或类似方法,结果通常是一个 stdClass 对象数组(即 array
✅ 正确做法:使用 json_decode(json_encode($object), true)
该方案通过 JSON 序列化与反序列化实现深度、安全、一致的转换:
// 假设 $result 是从数据库获取的 stdClass 对象数组 $result = [ (object)['id' => 1, 'name_of_condition' => 'Unconscious...'], (object)['id' => 1, 'name_of_condition' => 'Signs of a heart attack'], (object)['id' => 2, 'name_of_condition' => 'Condition test 1'] ]; // ✅ 安全转换为关联数组 $arr = json_decode(json_encode($result), true); // 现在可安全遍历并去重(例如按 name_of_condition 去重) $unique = []; $seen = []; foreach ($arr as $item) { $key = $item['name_of_condition'] ?? ''; if (!in_array($key, $seen)) { $seen[] = $key; $unique[] = $item; } }
⚠️ 注意事项:
- json_encode() 要求数据可序列化(无资源、闭包、循环引用),对常规数据库结果完全安全;
- 若需更高性能且确定结构简单,也可用 array_map() 配合 (array) 转换每个元素:
$arr = array_map(fn($obj) => (array)$obj, $result);
但此方式不处理嵌套对象,仅适用于扁平结构;
- 去重逻辑建议结合业务需求选择字段(如 name_of_condition、body_parts_id + conditions_id 组合等),避免仅依赖 id(因示例中多个不同病症共用 id=1)。
? 总结:永远避免对对象数组整体使用 (array)$object;优先采用 json_decode(json_encode($obj), true) 实现可靠转换,再配合 array_unique()(需先提取键值)或手动遍历完成去重,确保代码健壮、可维护。









