5

array_diff_uassoc内で互いに比較する前に配列がソートされたようです 。

このアプローチの利点は何ですか?

テストスクリプト

function compare($a, $b)
    {
    echo("$a : $b\n");
    return strcmp($a, $b);
    }

$a = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
$b = array('v' => 1, 'w' => 2, 'x' => 3, 'y' => 4, 'z' => 5);
var_dump(array_diff_uassoc($a, $b, 'compare'));


$a = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
$b = array('d' => 1, 'e' => 2, 'f' => 3, 'g' => 4, 'h' => 5);
var_dump(array_diff_uassoc($a, $b, 'compare'));


$a = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
$b = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
var_dump(array_diff_uassoc($a, $b, 'compare'));

$a = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
$b = array('e' => 5, 'd' => 4, 'c' => 3, 'b' => 2, 'a' => 1);
var_dump(array_diff_uassoc($a, $b, 'compare'));

http://3v4l.org/DKgms#v526

PS php7 でソートアルゴリズムが変更されたようです。

4

2 に答える 2

4

PHP 7 では、ソート アルゴリズムは変更されていません。パフォーマンスを向上させるために、要素が別の順序でソート アルゴリズムに渡されるだけです。

まあ、利益は最終的に実行が速くなる可能性があります。両方の配列に完全に他のキーがある場合、最悪のケースに遭遇します。

最悪の場合の複雑さは、配列を 2 回並べ替えてから、2 つの配列の各キーを比較することです。O(n*m + n * log(n) + m * log(m))

最良のケースは、2 回の並べ替えと、小さい方の配列の要素と同じ数の比較です。O(min(m, n) + n * log(n) + m * log(m))

一致した場合、配列全体と再度比較する必要はありませんが、一致後のキーからのみ比較します。

しかし、現在の実装では、並べ替えは冗長です。php-src での実装には改善が必要だと思います。完全なバグはありませんが、実装が悪いだけです。一部の C を理解している場合: http://lxr.php.net/xref/PHP_TRUNK/ext/standard/array.c#php_array_diffphp_array_diff(INTERNAL_FUNCTION_PARAM_PASSTHRU, DIFF_ASSOC, DIFF_COMP_DATA_INTERNAL, DIFF_COMP_KEY_USER); (関数はfrom 経由で呼び出されることに注意してくださいarray_diff_uassoc)

于 2015-03-04T05:22:43.907 に答える