0

这是要比较的两个数组。

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  
  } 

首先,您必须重建一个数组以构建适合下一步的结构,您将在其中搜索满足您条件的项目。该解决方案应该比您的解决方案更好,因为它的循环数要少得多(2 * n而不是n ^ 2)

于 2012-04-25T08:05:18.510 回答
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 回答
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 回答