有效的PHP阵列比较方式

时间:2012-04-25 08:02:27

标签: php arrays compare

这是要比较的两个数组。

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的userid在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 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

您可以考虑使用每个元素的userid作为数组键。这允许您在O(1)时间内在B中查找正确的项目。

答案 2 :(得分:0)

按用户ID对两个数组进行排序,然后创建时间。订单仍为O(N ^ 2),但比较次数大大减少。但是,由于您正在寻找userid上的显式匹配,然后将数组转换为数组('aaa'=&gt;数组(0 =&gt;'created_time',1 =&gt;'created_time'...)... )然后获取array_intersect(array_a,array_b)的值将为您提供所有常见的用户ID。

答案 3 :(得分: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进行比较,以查找匹配项。这至少应该是较少的比较。