深く考えるPHP配列のエルゴードの違いdiffの実現)


機能 アラリdiff($array_)1, $アラリ2) {     $diff = array();    foreach ($アラリ1 as $k => $v 1) {         $flags = false;        foreach ($アラリ2 as $v 2) {             if ($flags = ($v 1 == $v 2) {                 break;            }         }         if (!$flags {             $diff[$k] = $v 1;        }     }     return $diff;実現は可能であるが,この関数の効率は無惨であることが分かった。そこで私はもう一度考えてアルゴリズムを最適化しました。二番目の関数はこのように見えます。 アラリdiff($array_)1, $アラリ2) {     foreach ($アラリ1 as $key => $アイテム) {         if (同前array($item) $アラリ2, true {             unset($array_)1[$key]]        }     }     return $アラリ1;ええ、今回はほとんど元と一緒にできます。 アラリdiff 関数の速度は匹敵する。しかし、もっと最適化する方法がありますか?から ChinaUnix 前の文章(すみません、カンニングしました)を見つけました。 PHP こんなことができるとは。 アラリdiff($array_)1, $アラリ2) {     $アラリ2 = アラリflip($array_)2)    foreach ($アラリ1 as $key => $アイテム) {         if (isset($array_)2[$item]) {             unset($array_)1[$key]]        }      }     return $アラリ1;この関数の効率は驚くべきもので,元のものよりも優れている。 アラリdiff 関数の速度は全部速いです。なぜかというと、鍵は進行形ですから、説明を見つけました。 HASH 組織の、検索が早いです。に対する Value ただ…から キー 保存を組織して、自身は索引がなくて、毎回探すのはすべて巡回します。まとめてこれは PHP 言語の小さなコツですが、遍歴と対照配列の値においては、比較値が必要であればキーと反転するのが通常の値よりもはるかに効率的です。例えば、上の関数2は呼び出しが必要です。 同前array 関数は、関数内にあるかどうかを循環判定する必要があります。関数3は、この配列がこのキーがあるかどうかを判断するだけでいいです。配列キーと値の異なる組織インデックス方式を加えると、効率が想像以上に高那にあることが分かります。付コード

<?php
function microtime_float() {
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}

function array_diff2($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_diff3($array_1, $array_2) {
    foreach ($array_1 as $key => $item) {
        if (in_array($item, $array_2, true)) {
            unset($array_1[$key]);
        }
    }

    return $array_1;
}


function array_diff4($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]);
        }
     }

    return $array_1;
}

//////////////////////////////

for($i = 0, $ary_1 = array(); $i < 5000; $i++) {
    $ary_1[] = rand(100, 999);
}

for($i = 0, $ary_2 = array(); $i < 5000; $i++) {
    $ary_2[] = rand(100, 999);
}

header("Content-type: text/plain;charset=utf-8");

$time_start = microtime_float();
array_diff($ary_1, $ary_2);
echo "  array_diff  " . (microtime_float() - $time_start) . " 
";

$time_start = microtime_float();
array_diff2($ary_1, $ary_2);
echo "  array_diff2  " . (microtime_float() - $time_start) . " 
";

$time_start = microtime_float();
array_diff3($ary_1, $ary_2);
echo "  array_diff3  " . (microtime_float() - $time_start) . " 
";

$time_start = microtime_float();
array_diff4($ary_1, $ary_2);
echo "  array_diff4  " . (microtime_float() - $time_start) . " 
";
?>