我有一个编程问题,我需要帮助解决,我希望我能在这里得到一些帮助。基本上,我需要找到一种方法来合并从2个不同的RESTful API返回的数组数据,排序,然后分页。
请注意,我处理的是MLS数据(即:真实的地产上市),我用PHP为这个项目(独家).此外,这是2个不同的API,我正在使用:
SparkAPI https://sparkplatform.com/docs/overview/api
桥接RESO Web API https://bridgedataoutput.com/docs/platform/
具体来说,我遇到的问题是,这些API中的每一个对于每个请求可以检索多少条记录都有不同的限制。例如,Spark API允许我一次检索多达1000条记录,而Bridge API只允许我检索不超过200条记录。我理解为什么会有这些限制。到目前为止,这还不是一个问题。我这样说是因为有人要求我设法从这两个API中检索Real Estate列表,然后将从这两个API返回的所有数据合并到一个数组中,..然后基于列表价格对其进行排序(从最高到最低价格),..然后对它们进行分页(每页50个列表)。
如果我只使用这两种不同API中的一种,这就不是问题,因为它们都具有使数据排序和分页变得非常容易的特性。如果我使用只检索少量数据的查询(即:两个API合计不到50条记录),我已经实现了一些工作方法,允许我合并两个不同的数据集,然后根据标价对它们进行排序:
$mlsdata = array_merge($mlsdatamiami,$mlsdataftlauderdale);
function price_compare($a, $b) {
$t2 = $a['StandardFields']['ListPrice'];
$t1 = $b['StandardFields']['ListPrice'];
return $t1 - $t2;
}
usort($mlsdata, 'price_compare');
然而,不幸的是,我不处理小数据集,并且可能从两个API组合返回多达数万个列表。
虽然我已经成功地编写了一些代码,允许我对新的“合并”数据集进行分页,但这显然只在处理少量数据(少于1200条记录)时有效。
$finalarray = array_slice($newarray,$startposition,$perpagelimit);
foreach($finalarray as $item) {
...
}
但是同样,我处理的结果集并不少于1200条记录,因此,尽管我在分页结果集的第1页上从最高价格到最低价格显示列表,但在第2页上,所有内容都开始崩溃,列表价格突然变得到处都是。
我试过在一个for循环中运行多个不同的查询,将数据推送到一个新数组,然后将其与初始结果集合并。
$miamimlsdataraw = file_get_contents($apiurl);
$miamimlsdata = json_decode($miamimlsdataraw, true);
$number_of_miami_listings = $miamimlsdata['@odata.count'];
$miamilistingsarray = array();
if ($miamimlsdata['@odata.count'] > 200) {
$number_of_miami_queries = floor($number_of_miami_listings / 200);
$miami_listings_start_number = 200;
for ($x = 1; $x <= $number_of_miami_queries; $x++) {
$paramsextra = $params . "&\$skip=" . $miami_listings_start_number * $x;
$apiurl = $baseurl . '/' . $dataset . '/' . $endpoint . '?access_token=' . $accesstoken . $paramsextra;
$miamimlsdataraw = file_get_contents($apiurl);
$miamimlsdata_extra = json_decode($miamimlsdataraw, true);
array_push($miamilistingsarray,$miamimlsdata_extra);
}
}
$miamimlsdata = array_merge($miamilistingsarray,$miamimlsdata);
在这个实验中,我只处理了大约2,700个列表(仅来自其中一个API)..而且性能非常糟糕。当我尝试将所有返回的数据写入服务器上的文本文件时(而不是试图在页面中显示它),它的大小高达25 MB。不用说,我不认为我可以可靠地使用这种方法。
我曾经考虑过将其设置为cronjob,将数组数据存储在我们的数据库中(该站点基于WordPress),然后在运行时通过它进行检索和分页......而不是实时查询API。
所以...我知道这个问题是相当冗长的,但老实说,我不知道还能从哪里着手。我试图做的事情是不可能的吗?还是我可能错过了一些显而易见的东西?我欢迎所有的建议。
--伊万
1条答案
按热度按时间xfb7svmp1#
不需要对两个MLS的所有列表进行合并和排序。由于每页只需要50个列表,并且两个API都使用RESO,因此您可以让API仅返回所需的排序结果。例如,要获取第1页的列表,您只需要:
通过在while循环中同时循环两个数组,您可以在从两个数组中获得50个最高价格列表后立即挑选并停止。