PHP-可迭代对象问题


PHP - Iterable Object Issue

我正在一个网站上工作,我们的系统管理员可以在该网站上选择是从mongodb还是从elasticsearch检索数据。我可以设置两者都很好,但我想设置一个切换案例,根据网站管理部分的偏好选择正确的文档检索系统。当mongo返回一个stdClass对象时,我可以遍历该对象,使用以下内容打印每个项目:

foreach($items as $item)
{
    print_r($item);
}

然后,我可以使用$items->count()检索返回的项目总数。然而,当使用弹性搜索时,我返回了一个我需要去的对象:

foreach($items['hits']['hits'] as $item)
{
    print_r($item);
}

可以使用$items['hits']['total']检索计数。如果我从elasticsearch返回的数据中提取项的数组(我们称之为"$finaliztems")和计数(我们称其为$count),我如何将其转换为类似mongo返回的stdClass对象,以便我可以直接迭代该类以获得每个项的值,并调用一个方法count()来检索计数?我想这样做,这样我就可以在两个数据对象之间轻松切换,而不必使用完全独立的函数来处理同一任务。

由于多种原因,我不建议将ElasticSearch结果转换为MongoDB结果(反之亦然)。一个是,尽管现在如果你把它们都作为同一个对象,感觉会更容易,但在未来,由于可能需要使用/操作更多的字段,这可能会成为一场噩梦。

一种解决方案是创建一个新的类,比如DocumentItem,并将MongoDBElasticSearch的结果转换为这个类。这样,代码中对MongoDBElasticSearch的返回值进行操作、迭代和其他操作的部分将使用其定义的方法在DocumentItem对象上工作。

您将有两个转换函数来翻译MongoDB&ElasticSearch将值返回到此对象。将来,如果需要添加新字段,则需要相应地更新转换函数。如果添加了一个新的DocumentServer,您只需要编写转换函数,因为DocumentItem类已经定义好了。