background image

PHP 数组遍历的几种方法差异(array_diff 的实现)

 

给你两个分别有 5000 个元素的数组,计算他们的差集,说白了也就是用 PHP 和你

认为最好的算法实现 array_diff 的算法。

初次接到这个题目,我发现这非常的简单,于是按照以往的经验写了一个:

function array_diff($array_1, $array_2) {

    $diff = array();
   
    foreach ($array_1 as $k => $v1) {
        $flag = false;
        foreach ($array_2 as $v2) {
            if ($flag = ($v1 == $v2)) {
                break;
            }
        }
   
        if (!$flag) {
            $diff[$k] = $v1;
        }
    }
   
    return $diff;
}

虽然实现是可以的,但是发现这个函数的效率是惨不忍睹。于是我又重新考虑了下,并优
化了算法,第二个函数看起来是这个样子的:

function array_diff($array_1, $array_2) {
    foreach ($array_1 as $key => $item) {
        if (in_array($item, $array_2, true)) {
            unset($array_1[$key]);
        }
    }
   
    return $array_1;
}

 

但是还有没有更优化的办法呢?我发现 PHP 竟然可以这样写:
function array_diff($array_1, $array_2) {
    $array_2 = array_flip($array_2);
    foreach ($array_1 as $key => $item) {
        if (isset($array_2[$item])) {
            unset($array_1[$key]);
        }