関数 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)) { ] = $v1;
}実装は可能ですが、この関数の効率は驚くべきものであることがわかりました。したがって、アルゴリズムを再検討して最適化しました。に匹敵します 。しかし、より最適化された方法はあるのでしょうか? ChinaUnix に関する記事 (ごめんなさい、騙しました) から、PHP は実際には次のように記述できることがわかりました。 key => $item) {
}この関数は非常に効率的ですこれは驚くべきことであり、元の array_diff 関数よりもさらに高速です。理由を調査すると、次の説明が見つかりました。
キーが HASH によって編成されているため、検索が非常に高速です。
値はキー編成にのみ格納され、インデックス自体がないため、すべての検索が横断されます。まとめ
これは PHP 言語のちょっとしたトリックですが、配列の値を走査して比較する場合、値を比較する必要がある場合は、キーを使用して値を反転する方が、通常の値間の比較よりも実際にはるかに効率的です。たとえば、上記の関数 2 は in_array 関数を呼び出し、それが関数内にあるかどうかを判断するためにループする必要がありますが、関数 3 はキーが配列内に存在するかどうかを判断するだけです。配列のキーと値のさまざまな組織的なインデックス付け方法と組み合わせると、効率が想像よりも高いことがよくわかります。
添付コード
コードをコピー
コードは次のとおりです:
function microtime_float() {
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
関数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;
}
}
$diff;
}
function array_diff3($array_1, $array_2) {
foreach ($array_1 as $key => $item) {
if (in_array($item, $array_2, true)) {
{ unset($array_1[$鍵]);
}
}
return $array_1;
}
関数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 $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) 。 " 秒";
?>
以上は、colesafearray の PHP 数分布の違い (array_diff の実現) を深く考えたもので、colesafearray に関する内容が含まれており、PHP 教則に関心のある友人の助けになることが望ましいです。