我正在寻找一种有效的方法将REST API的结果与查询结果结合到托管的MySQL数据库中。我需要能够对结果进行分页和排序,但是我无法确定最佳方法,以便保持记录的顺序。我正在使用PHP和Curl向服务发送休息请求。
我使用的外部API是多事的(http://api.eventful.com/),我的MySQL数据库存储的事件信息基本相同。我想从这两个来源中获取,排序并启用分页。
即 在这个例子中,我们有一个LIMIT为4,但有些记录可能来自eventful,而其他记录可能来自MySQL,具体取决于日期。我认为您需要保留API和MySQL结果的偏移量,并将它们减少每个页面中使用的记录数。但是,除非我从两个来源中提取所有记录,否则我不知道如何排序。
事件名称/日期/来源(E =多事,M = MySQL)
| page_num 1 | page_num 2 | page_num 3 | |:-----------:|------------:|:------------:| | A|7/27|E | E|7/31|E | I|8/04|M | | B|7/28|M | F|8/01|M | J|8/05|M | | C|7/29|E | G|8/02|M | K|8/06|E | | D|7/30|M | H|8/03|E | L|8/07|E |
答案 0 :(得分:1)
如果无法在数据库中存储数据,则必须在PHP中进行合并和排序。
以下是一个示例(CodePad),使用两个无序数组 - 每个数组都描述了您的数据源:
$mysql = array
(
array('name' => 'I', 'date' => '20110804'),
array('name' => 'J', 'date' => '20110805'),
array('name' => 'F', 'date' => '20110801'),
array('name' => 'D', 'date' => '20110730'),
array('name' => 'B', 'date' => '20110728'),
array('name' => 'G', 'date' => '20110802'),
);
$eventful = array
(
array('name' => 'L', 'date' => '20110807'),
array('name' => 'A', 'date' => '20110727'),
array('name' => 'E', 'date' => '20110731'),
array('name' => 'H', 'date' => '20110803'),
array('name' => 'K', 'date' => '20110806'),
array('name' => 'C', 'date' => '20110729'),
);
您需要选择要在每个数据源上显示的相等数量的最大事件,并将两个数组合并为一个多维数组,然后我们将使用array_multisort()
对其进行排序:
$dates = array();
$result = array_merge($mysql, $eventful);
foreach ($result as $key => $value)
{
$dates[$key] = $value['date'];
}
array_multisort($dates, SORT_ASC, $result);
然后$result
变量将按升序排序:
Array
(
[0] => Array
(
[name] => A
[date] => 20110727
)
[1] => Array
(
[name] => B
[date] => 20110728
)
[2] => Array
(
[name] => C
[date] => 20110729
)
[3] => Array
(
[name] => D
[date] => 20110730
)
[4] => Array
(
[name] => E
[date] => 20110731
)
[5] => Array
(
[name] => F
[date] => 20110801
)
[6] => Array
(
[name] => G
[date] => 20110802
)
[7] => Array
(
[name] => H
[date] => 20110803
)
[8] => Array
(
[name] => I
[date] => 20110804
)
[9] => Array
(
[name] => J
[date] => 20110805
)
[10] => Array
(
[name] => K
[date] => 20110806
)
[11] => Array
(
[name] => L
[date] => 20110807
)
)
如果您需要降序,则可以改为使用SORT_DESC
常量。
要 paginate 此数组,您只需使用array_chunk()
:
$result = array_chunk($result, 4); // 4 events per "page"
反过来,它产生一个具有附加维度的数组:
Array
(
[0] => Array
(
[0] => Array
(
[name] => A
[date] => 20110727
)
[1] => Array
(
[name] => B
[date] => 20110728
)
[2] => Array
(
[name] => C
[date] => 20110729
)
[3] => Array
(
[name] => D
[date] => 20110730
)
)
[1] => Array
(
[0] => Array
(
[name] => E
[date] => 20110731
)
[1] => Array
(
[name] => F
[date] => 20110801
)
[2] => Array
(
[name] => G
[date] => 20110802
)
[3] => Array
(
[name] => H
[date] => 20110803
)
)
[2] => Array
(
[0] => Array
(
[name] => I
[date] => 20110804
)
[1] => Array
(
[name] => J
[date] => 20110805
)
[2] => Array
(
[name] => K
[date] => 20110806
)
[3] => Array
(
[name] => L
[date] => 20110807
)
)
)
请记住,这比典型的数据库排序和限制要低得多,主要是因为您将整个数据加载到内存中,甚至是那些活动“页面”不需要的数据。
我不确定你期望处理的数据量是多少,但是array_multisort()
可以很好地执行几千条记录(我实际上从未将它用于任何更大的记录),如果你是寻找进一步的优化,你可以销毁分块数组的不需要的索引,或者使用array_slice()
和一些算术来获取属于某个页面的四个特定记录。
尽管如此,如果你可以优化你的选择(可能有一些业务/日期逻辑,不确定),你可能会使整个排序+块(或切片)处理更多CPU和内存友好。
答案 1 :(得分:0)
如何从两个源中提取数据,将所有数据存储在数据库中,然后使用某些php查询该数据库以分页结果。