
本文详解如何正确将数据库查询返回的 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()(需先提取键值)或手动遍历完成去重,确保代码健壮、可维护。










