这是要比较的两个数组。
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) ?
答案 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进行比较,以查找匹配项。这至少应该是较少的比较。