0

比較する2つの配列を次に示します。

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] => array('userid' => aaa、'created_time' => XXXX、)、[1] => array('userid' => bbb、'created_time' => XXXX、)を変換する方法、)

フォーム配列(aaa => XXXX、bbb => XXXX)に?

4

4 に答える 4

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  
  } 

最初に、配列の1つを再構築して、次のステップに適した構造にする必要があります。ここで、条件に一致するアイテムを検索します。このソリューションは、ループの数がはるかに少ないため(n^2ではなく2*n)、自分のソリューションよりも優れているはずです。

于 2012-04-25T08:05:18.510 に答える
0

各要素のユーザー ID を配列キーとして使用することを検討できます。これにより、O(1) 時間で B の正しいアイテムを検索できます。

于 2012-04-25T08:08:08.520 に答える
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++;
    }
}

ユーザー ID が両方とも同じ順序でソートされている場合、a の各ユーザー ID と b の各ユーザー ID を比較して一致を探す必要はありません。これは、少なくとも比較を少なくする必要があります。

于 2012-04-25T08:46:18.460 に答える
0

両方の配列をユーザー ID と作成時間で並べ替えます。順序はまだ O(N^2) ですが、比較の数は大幅に減少しています。ただし、ユーザー ID の明示的な一致を探しているため、配列を array('aaa'=>array(0=>'created_time', 1=>'created_time'...)...) に変換してから取得しますarray_intersect(array_a, array_b) の値は、すべての一般的なユーザー ID を提供します。

于 2012-04-25T08:13:19.953 に答える