繁体   English   中英

php数组比较的有效方法

[英]efficient way of php array 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的用户ID在array_b中,而array_a的created_time比array_b的用户ID更新。

我使用以下代码执行此操作,但是如果数组很大,将花费很长时间。

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)吗?

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)

您可以考虑将每个元素的用户标识用作数组键。 这使您可以在O(1)时间中在B中查找正确的项目。

按用户ID对两个数组进行排序,然后创建时间。 阶数仍然是O(N ^ 2),但是比较次数却大大减少了。 但是,由于您正在寻找与userid的显式匹配,因此将数组转换为array('aaa'=> array(0 =>'created_time',1 =>'created_time'...)...)然后得到array_intersect(array_a,array_b)的值将为您提供所有常见的用户ID。

$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进行比较以查找匹配项。 至少应该少进行比较。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM