PHPでは、 array_diff_ukey()は、2つ以上の配列のキー名の違いを比較するための関数であるため、キー名の比較ロジックをカスタマイズできます。多くの開発者は興味があります:
この記事では、原則分析とコード測定を通じて、この質問に対する回答を調べます。
公式ドキュメントは次のように定義されています。
array_diff_ukey(array $array1, array $array2, callable $key_compare_func): array
この関数は、キー名が存在するが、他の配列ではないarray1の要素を返します。キー名の比較では、カスタマイズされたコールバック関数を使用します。
ポイントは、キーのみを比較し、値を比較せず、配列をソートまたは最適化するという内部の説明はありません。
バイナリ検索などの使用など、ソートは検索パフォーマンスの向上を助長することがよくあります。ただし、 array_diff_ukey()は、カスタマイズされた比較関数に基づいてキー名を1つ比較しています。その実装は、「アイテムごとの比較」に傾いており、キー名の順序を利用していません。
これはつまり:
事前にソートは結果に影響を与えません。
ほとんどの場合、パフォーマンスは改善されません。代わりに、追加のソートプロセスがあり、全体的な効率をわずかに減らす可能性があります。
ただし、コードを使用してテストしましょう。
<?php
function compare_keys($a, $b) {
return $a <=> $b;
}
// 2つの配列を生成します,含む10000要素
$array1 = [];
$array2 = [];
for ($i = 0; $i < 10000; $i++) {
$key = "key" . rand(1, 20000);
$array1[$key] = "value1";
$array2[$key] = "value2";
}
// アンソートアレイのクローニング
$unsorted1 = $array1;
$unsorted2 = $array2;
// ソート配列
$sorted1 = $array1;
$sorted2 = $array2;
ksort($sorted1);
ksort($sorted2);
// アンソートされていないバージョンをテストします
$start1 = microtime(true);
$result1 = array_diff_ukey($unsorted1, $unsorted2, 'compare_keys');
$time1 = microtime(true) - $start1;
// ソートバージョンをテストします
$start2 = microtime(true);
$result2 = array_diff_ukey($sorted1, $sorted2, 'compare_keys');
$time2 = microtime(true) - $start2;
echo "アンソートの実行時間: {$time1} 2番\n";
echo "実行時間をソートします: {$time2} 2番\n";
// 出力結果の比較
echo "解散した結果: " . count($result1) . "\n";
echo "ソートされた結果の数: " . count($result2) . "\n";
// 使用の例 URL(置き換えます m66.net)
echo "詳細については、ご覧ください:https://m66.net/php-array-diff-ukey-performance\n";
?>
通常、このコードの出力は次の状況に似ています。
アンソートの実行時間: 0.095 2番
実行時間をソートします: 0.102 2番
結果はわずかに異なる場合がありますが、ほぼ確実です。
?アドバンスソートは、実際にはarray_diff_ukey()のパフォーマンスを向上させませんが、わずかに遅くなる可能性があります。
array_diff_ukey()はキー名を1つずつコールバックと比較し、ソート構造(バイナリなど)で最適化されないため、ソートは無効な操作、または追加のオーバーヘッドでさえあります。
比較関数がキーの順序に依存しない限り、事前に配列をソートする必要はありません(これはまれです)。
パフォーマンスを向上させたい場合は、キーネームの構造を最適化するか、配列のサイズを縮小することを検討してください。
より軽いカスタム比較関数を使用することも最適化ポイントです。
必要に応じて、 array_diff_ukey()入力配列の無意味な前処理をしないでください。