2012-04-25 26 views
0

ここでは比較対象の2つの配列があります。PHPの効率的な比較方法

array_a(
[0] => array('userid' => aaa, 'created_time' => XXXX,), 
[1] => array('userid' => bbb, 'created_time' => XXXX,), 
[2] => array('userid' => ccc, 'created_time' => XXXX,) 
) 


array_b(
[0] => array('userid' => aaa, 'created_time' => XXXX,), 
[1] => array('userid' => ccc, 'created_time' => XXXX,), 
[2] => array('userid' => ddd, 'created_time' => XXXX,) 
) 

私は、次の条件に一致するすべての要素を取得したい: ARRAY_AのユーザーIDがarray_bにあり、 ARRAY_AのCREATED_TIMEは、より新しいarray_bの

私はこれを行うには、次のコードを使用しますが、それがかかりますアレイが巨大であれば長い時間です。

for array_a{ 
    for array_b{ 
    if (a[user_id] = b[user_id] && a[created_time] > b[created_time]) { 
     //target got 
    } 
    } 
} 

このロジックを効率的に行う方法はありますか?

ありがとうございます。 IDは一意です。 変換する方法 array_a([0] =>配列( 'userid' => aaa、 'created_time' => XXXX)、 [1] =>配列( 'userid' => bbb、 'created_time' => XXXX、bbb => XXXX) ? array(aaa => XXXX、bbb => XXXX)

+1

ここでできることは、配列を 'array(' aaa '=> XXXX、' bbb '=> XXXX) 'のように変更することだけです。特にデータがこのフォーマットになる前にそれを行うことができれば(それは仕事にはあまり適していません)。 – Jon

+3

すべてのユーザIDが一意の場合は、配列Bを 'arrayB [user_id] => created_time'にマッピングすることができます。次に、配列Aを繰り返し処理し、配列BのユーザIDを参照するだけです( 'O(1)')。それは 'O(n^2)'の代わりに 'O(2n)'のまわりです。 –

+0

ユーザーIDはソート順になっていますか? – Jack

答えて

1
foreach($array_a as $arr) 
    $tmp[$arr['userid']] = $arr['created_time']; //rebulding first array 

foreach($array_b as $arr) 
    if(isset($tmp[$arr['userid']]) && $arr['created_time'] < $tmp[$arr['userid']]){ 
    //target 
    } 

まず、次のステップに適した構造に配列を再構築して、条件を満たすアイテムを探します。 ループの数がはるかに少ないので(n^2の代わりに2 * n)、このソリューションはあなたより優れているはずです

+4

さて、それはどうですか?あなた自身の質問をしていますか? – Jon

+0

大丈夫、私はシルバープレート上のすべてを欲しがっている怠惰なB ******のコードを更新しました(私の英語のために申し訳ありません、あなたは私を理解することを願っています) – miro

+0

申し訳ありませんが、あなたのコードは何も役に立たないの総額を行うためのメモリの多く。 'created_time'が役割を果たす部分を欠場しましたか? – Jon

0

各要素のuseridを配列キーとして使用することもできます。これにより、O(1)時間内にB内の正しい項目を検索することができます。

0

両方の配列をユーザーIDで並べ替えてから、時間を作成します。順序はまだO(N^2)ですが、比較の数は大幅に減少します。しかし、あなたはuseridで明示的に一致するものを探しているので、配列をarray( 'aaa' =>配列(0 => 'created_time'、1 => 'created_time' ...)...)に変換してからarray_intersect(array_a、array_b)の値は、すべての共通ユーザーIDを提供します。ユーザーIDの両方が同じ順序でソートされている場合は

0
$b_index = 0; 
for ($a_index = 0; $a_index < count($a); $a_index++) 
{ 
    if ($a[$a_index]['userid'] == $b[$b_index]['userid']) 
    { 
     if ($a[$a_index]['created_time'] >= $b[$b_index]['created_time']) 
      $array[] = $a[$a_index]; 
     $b_index++; 
    } 
} 

は、あなたがマッチを探すために、Bの各ユーザIDとで比較した各ユーザーIDにする必要はありません。これは少なくとも比較は少なくなるはずです。

関連する問題