2011-07-27 9 views
2

REST APIの結果とホストされたMySQLデータベースへのクエリの結果を組み合わせる効率的な方法を探しています。結果をページ分けしソートする能力が必要ですが、レコードの順序が維持されるような最善の方法を決定することには問題があります。私はPHPとCurlを使ってサービスに休憩リクエストを送信しています。MySQLの結果セットを使用して外部APIを結合、ページ分割、ソートする方法

私が使用している外部APIは、多忙であり(http://api.eventful.com/)、MySQLデータベースには基本的に同じイベント情報が格納されています。私は、これらのソースの両方から抜け出し、並べ替えを行い、改ページを有効にしたいと思います。

つまりこの例では ですが、LIMITは4ですが、日付によっては大事なものや多少なりとも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

どのように、両方のソースからデータを引っ張って、データベース内のすべてを格納して、結果をページ分割するために、いくつかのPHPを使用して、そのデータベースを照会について。

+0

これは実際には機能しますが、私はAPIがキャッシュの保存やメンテナンスを許可していないことを読みました。一度に多くのレコードを取得する可能性があるので、このアプローチに対する私の他の懸念はパフォーマンスだと思います。答えをありがとう。 – CloudSurf

1

DBにデータを格納することはオプションではないため、PHP内でマージしソートする必要があります。 、

$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'), 
); 

あなたは各データソースに表示する最大のイベントの等しい量を選択することをお勧めします:あなたのデータソースを記述し、それぞれ1 -

は、ここでは、2つの順不同のアレイを使用して、例えば、(CodePad)であります

$dates = array(); 
$result = array_merge($mysql, $eventful); 

foreach ($result as $key => $value) 
{ 
    $dates[$key] = $value['date']; 
} 

array_multisort($dates, SORT_ASC, $result); 

$result変数は、次に昇順にソートされます:

、我々はその後ソート array_multisort()を使用します単一の多次元アレイに両方のアレイをマージ
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定数を使用できます。

この配列は、あなただけのarray_chunk()を使用することができるのpaginateへ:

順番に、追加のディメンションを持つ配列生成し、
$result = array_chunk($result, 4); // 4 events per "page" 

:これは、Aであることを

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()と算術演算を使用して特定のページに属する4つの特定のレコードを取得することができます。

しかし、あなたの選択を最適化することができれば(多分ビジネス/日付論理では)、並べ替え+チャンク(またはスライス)処理のほうがCPUとメモリをより使いやすくするでしょう。

関連する問題