recherche

Maison  >  Questions et réponses  >  le corps du texte

PHP compare des tableaux bidimensionnels, donnez-moi quelques conseils

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.

巴扎黑巴扎黑2753 Il y a quelques jours401

répondre à tous(2)je répondrai

  • 漂亮男人

    漂亮男人2017-05-16 13:10:04

    $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);
    

    répondre
    0
  • 怪我咯

    怪我咯2017-05-16 13:10:04

    $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
    

    répondre
    0
  • Annulerrépondre