Un tableau bidimensionnel de la liste des participants
$arr1=array(
array('name'=>'Zhang San','phone'=>'1354459845','address' => ;'N° 5, Première rue'),
array('name'=>'李思' ,'phone'=>'1323439845','address'=>'No. 3, First Street'),
array('name'=>'Chen Wu','phone'=>' 1354353145' ,'address'=>'No. 2, First Street'),
);
Un tableau bidimensionnel de listes de gains de loterie historiques
$arr2=array(
array('name'=>'mary','phone'=>'1313598445 ','address'=>'No. 8, First Street'),
array('name'=>'jhon','phone'=>'1323298425','addre ss'=>'No. 9, First Street'),
array('name'=>'Chen Wu', 'phone'=>'1353dsad45', 'address'=>'一Rue n°10'),
);
Il faut maintenant comparer ces deux tableaux. Tant qu'un des noms nom, téléphone ou adresse appara?t dans la liste historique, il faut le retirer de l'arr1 participant. liste d'activités.
En plus de deux comparaisons foreach, existe-t-il un bon moyen d'obtenir rapidement les résultats de la liste d'activités filtrée?? Les deux listes comptent au moins plusieurs milliers. Si vous utilisez foreach deux fois, la vitesse sera très lente.
$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 = [];
///////準(zhǔn)備測(cè)試數(shù)據(jù)
for ($i = 0; $i < 100000; ++$i) {
$arr1_sub = [];
$arr1_sub ['name'] = sprintf('測(cè)試%s', rand(0, 10000));
$arr1_sub ['phone'] = sprintf('13%s', rand(111111111, 999999999));
$arr1_sub ['address'] = sprintf('一街%s號(hào)', rand(0, 10000));
$arr1[] = $arr1_sub;
$arr2_sub = [];
$arr2_sub['name'] = sprintf('測(cè)試%s', rand(0, 10000));
$arr2_sub['phone'] = sprintf('13%s', rand(111111111, 999999999));
$arr2_sub['address'] = sprintf('一街%s號(hào)', rand(0, 10000));
$arr2[] = $arr2_sub;
}
//////測(cè)試開始
$begin = microtime(true);
$diff_key_array = [
'name' => 'phone',
'phone' => 'phone',
'address' => 'phone',
];
$diff_res_array = [];
///1、根據(jù) key,緩存對(duì)一個(gè)數(shù)據(jù)差
foreach ($diff_key_array as $k => $v) {
///找到對(duì)應(yīng)的 name、address、phone 需要留下的數(shù)據(jù)
$diff_res_array[$k] = array_diff_assoc(array_column($arr2, $v, $k), array_column($arr1, $v, $k));
}
unset($arr1); //清理不需要的數(shù)組 arr2
///過濾對(duì)應(yīng) arr2 數(shù)據(jù)
$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 的方案,實(shí)現(xiàn)解決 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萬(wàn)數(shù)據(jù),用時(shí)約 float 0.69 s
///100萬(wàn)數(shù)據(jù),用時(shí)約 float 14.86 s