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
相关产品推荐
相关产品推荐

