You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP遍历MongoDB结果报错:无法将MongoDB\BSON\UTCDateTime对象用作数组

解决MongoDB遍历数组时的「Cannot use object of type MongoDB\BSON\UTCDateTime as array」错误

首先咱们得揪出报错的根源:虽然你没直接碰dateTimeCreated或dateTimeUpdated字段,但你遍历的$resultSet['dataINeed']数组里,混进了一个MongoDB\BSON\UTCDateTime对象,而非你预期的包含stringINeed的关联数组。看你给出的原始数据,索引是0、1、3,缺了索引2——十有八九这个缺失的位置对应的元素就是一个日期对象,当循环到它时,你尝试访问$singleResult['stringINeed'],相当于把对象当成数组来用,直接触发了错误。

给你两个实用的解决方案:

方案1:遍历前做类型检查,过滤异常元素

修改你的循环代码,先确认当前元素是数组且包含目标字段,再进行取值(另外注意你之前的代码每次循环都会覆盖$stringArray,要改成追加元素到数组里):

$stringArray = [];
foreach($resultSet['dataINeed'] as $singleResult) {
    // 先验证当前元素的结构符合预期
    if (is_array($singleResult) && isset($singleResult['stringINeed'])) {
        $stringArray[] = $singleResult['stringINeed'];
    }
}

方案2:查询时指定typeMap,强制转成数组

如果你的MongoDB驱动默认返回的是BSON对象而非关联数组,可以在查询时通过typeMap选项,让驱动把所有BSON文档直接转成数组,从根源避免对象混进数组的问题:

// 示例查询代码,可根据你的实际查询条件调整
$filter = [];
$options = [
    'typeMap' => [
        'root' => 'array',
        'document' => 'array',
        'array' => 'array'
    ]
];
$cursor = $collection->find($filter, $options);
$resultSet = $cursor->toArray();

这样处理后,返回的dataINeed里的所有元素都会是标准关联数组,不会再出现UTCDateTime对象干扰遍历的情况。

内容的提问来源于stack exchange,提问作者morecoffeeplz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:35:07