[英]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.