PHP比较二维数组,求大神赐教
巴扎黑
巴扎黑 2017-05-16 13:08:04
0
2
411

一个参与活动名单的二维数组
$arr1=array(
array('name'=>'张三','phone'=>'1354459845','address'=>'一街5号'),
array('name'=>'李四','phone'=>'1323439845','address'=>'一街3号'),
array('name'=>'陈五','phone'=>'1354353145','address'=>'一街2号'),
);

一个历史中奖名单的二维数组
$arr2=array(
array('name'=>'mary','phone'=>'1313598445','address'=>'一街8号'),
array('name'=>'jhon','phone'=>'1323298425','address'=>'一街9号'),
array('name'=>'陈五','phone'=>'1353dsad45','address'=>'一街10号'),
);
现在要比较这两个数组,只要名称name或phone或address其中一个在历史名单中出现过,就要把他从arr1参与活动名单中去掉。
除了两次foreach再比较以外,有什么好的方法可以快速地得出筛选后的活动名单结果。两份名单都至少几千,如果用两次foreach的话速度会很慢

巴扎黑
巴扎黑

Antworte allen(2)
漂亮男人
$arr = [
    ["name" => "李四", "phone" => '5555', "address" => 'aaa' ],
    ["name" => "张三", "phone" => '6666', "address" => 'bbb' ],
    ["name" => "老王", "phone" => '7777', "address" => 'ccc' ],
];
$filter = [
    ["name" => "李四", "phone" => '3333', "address" => 'xyz' ],
    ["name" => "王三", "phone" => '6666', "address" => 'xyz' ],
];

$arr = array_filter($arr, function($i) use ($filter) {
    return !in_array($i['name'], array_column($filter, 'name')) && !in_array($i['phone'], array_column($filter, 'phone'));
});
var_dump($arr);
刘奇
$arr1 = [];
$arr2 = [];

///////准备测试数据
for ($i = 0; $i < 100000; ++$i) {
    $arr1_sub = [];
    $arr1_sub ['name'] = sprintf('测试%s', rand(0, 10000));
    $arr1_sub ['phone'] = sprintf('13%s', rand(111111111, 999999999));
    $arr1_sub ['address'] = sprintf('一街%s号', rand(0, 10000));
    $arr1[] = $arr1_sub;

    $arr2_sub = [];
    $arr2_sub['name'] = sprintf('测试%s', rand(0, 10000));
    $arr2_sub['phone'] = sprintf('13%s', rand(111111111, 999999999));
    $arr2_sub['address'] = sprintf('一街%s号', rand(0, 10000));
    $arr2[] = $arr2_sub;
}

//////测试开始
$begin = microtime(true);

$diff_key_array = [
    'name' => 'phone',
    'phone' => 'phone',
    'address' => 'phone',
];
$diff_res_array = [];

///1、根据 key,缓存对一个数据差
foreach ($diff_key_array as $k => $v) {
    ///找到对应的 name、address、phone 需要留下的数据
    $diff_res_array[$k] = array_diff_assoc(array_column($arr2, $v, $k), array_column($arr1, $v, $k));
}
unset($arr1); //清理不需要的数组 arr2

///过滤对应 arr2 数据
$result = array_filter($arr2, function ($value) use ($diff_key_array, &$diff_res_array) {
    foreach ($diff_key_array as $k => $v) {
        $item = $value[$k];
        //利用 php 中,hash 找 key 的方案,实现解决 O(1)查找
        if (!isset($diff_res_array[$k][$item])) {
            return false;
        }
    }
    return true;
});
unset($diff_key_array);
unset($diff_res_array);

$exec_time = microtime(true) - $begin;
var_dump($exec_time);
var_dump($result);

/// 10万数据,用时约 float  0.69 s
///100万数据,用时约 float 14.86 s
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage