【问题标题】:What is the difference between array_udiff_assoc() and array_diff_uassoc()?array_udiff_assoc() 和 array_diff_uassoc() 有什么区别?
【发布时间】:2012-02-02 17:35:30
【问题描述】:

array_udiff_assoc()array_diff_uassoc() 有什么区别?

对于array_udiff_assoc(),我有这个代码:

function myfunction($v1,$v2)
{
    if ($v1===$v2) {
        return 0;
    }
    return 1;
}
 
$a1 = ["a" => "Cat", "b" => "Dog", "c" => "Horse"];
$a2 = ["a" => "Cat", "b" => "Horse", "c" => "Dog"];
print_r(array_udiff_assoc($a1, $a2, "myfunction"));

结果

Array ( [b] Dog [c] => Horse )

还有array_diff_uassoc():

function myfunction($v1,$v2)
{
    if ($v1===$v2) {
        return 0;
    }
    return 1;
}
     
$a1 = ["a" => "Cat", "b" => "Dog", ​"c" => "Horse"];
​$a2 = ["a" => "Cat", "b" => "Horse", "c" => "Dog"];
​print_r(array_diff_uassoc($a1, $a2, "myfunction"));

结果和第一个一样:

Array ( [b] Dog [c] => Horse )

如果他们有任何区别,那是什么? PHP手册并没有说它们是彼此的别名。

【问题讨论】:

  • 您还可以将array_diff_assocarray_udiff_uassoc 添加到比较中...

标签: php arrays associative custom-function array-difference


【解决方案1】:

它们都做同样的事情,但udiff-assoc 将 DATA 与用户提供的函数进行比较,而 diff-uassoc 将 INDEX 与用户提供的函数进行比较。

作为对@lonsesomeday 的回答:如“u”所示,diff_assoc 将使用内部函数进行所有比较,udiff_uassoc 使用提供的回调进行索引和数据比较。

http://www.php.net/manual/en/function.array-diff-uassoc.php

http://www.php.net/manual/en/function.array-udiff-assoc.php

【讨论】:

    【解决方案2】:

    也许一系列测试用例可以消除这些相关原生函数之间的任何混淆。我将始终使用本机不区分大小写的比较函数strcasecmp() 来简化演示/说明。

    下面是每个函数的行为方式的简单英文解释:

    1. array_diff() - 区分大小写的仅值比较
    2. array_diff_key() - 区分大小写的仅键比较
    3. array_diff_ukey() - 不区分大小写的仅键比较
    4. array_diff_assoc() - 区分大小写的键和区分大小写的值比较
    5. array_diff_uassoc() - * 首次出现不区分大小写的键和区分大小写的值比较
    6. array_udiff() - 不区分大小写的仅值比较
    7. array_udiff_assoc() - 区分大小写的键和不区分大小写的值比较
    8. array_udiff_uassoc() - 不区分大小写的键和不区分大小写的值比较

    *请密切注意 5. array_diff_uassoc()['c' => 'd']['m' => 'n'] 比较方面的行为不同,这是因为 $second 数组中的限定出现顺序。

    代码:(Demo)

    $first = [
        'A' => 'B',
        'c' => 'd',
        'E' => 'f',
        'g' => 'I',
        'k' => 'F',
        'm' => 'n',
        'o' => 'p',
    ];
    
    $second = [
        'a' => 'b',
        'A' => 'b',
        'C' => 'd',
        'c' => 'D',
        'e' => 'F',
        'G' => 'H',
        'i' => 'B',
        'J' => 'D',
        'm' => 'N',
        'M' => 'n',
        'O' => 'r',
    ];
    
    echo "array_diff()\n";
    var_export(array_diff($first, $second));
    echo "\n---\narray_diff_key()\n";
    var_export(array_diff_key($first, $second));
    echo "\n---\narray_diff_ukey()\n";
    var_export(array_diff_ukey($first, $second, 'strcasecmp'));
    echo "\n---\narray_diff_assoc()\n";
    var_export(array_diff_assoc($first, $second));
    echo "\n---\narray_diff_uassoc()\n";
    var_export(array_diff_uassoc($first, $second, 'strcasecmp'));
    echo "\n---\narray_udiff()\n";
    var_export(array_udiff($first, $second, 'strcasecmp'));
    echo "\n---\narray_udiff_assoc()\n";
    var_export(array_udiff_assoc($first, $second, 'strcasecmp'));
    echo "\n---\narray_udiff_uassoc()\n";
    var_export(array_udiff_uassoc($first, $second, 'strcasecmp', 'strcasecmp'));
    

    输出:

    array_diff()
    array (
      'E' => 'f',
      'G' => 'I',
      'o' => 'p',
    )
    ---
    array_diff_key()
    array (
      'E' => 'f',
      'k' => 'F',
      'o' => 'p',
    )
    ---
    array_diff_ukey()
    array (
      'k' => 'F',
    )
    ---
    array_diff_assoc()
    array (
      'A' => 'B',
      'c' => 'd',
      'E' => 'f',
      'G' => 'I',
      'k' => 'F',
      'm' => 'n',
      'o' => 'p',
    )
    ---
    array_diff_uassoc()
    array (
      'A' => 'B',
      'E' => 'f',
      'G' => 'I',
      'k' => 'F',
      'm' => 'n',
      'o' => 'p',
    )
    ---
    array_udiff()
    array (
      'G' => 'I',
      'o' => 'p',
    )
    ---
    array_udiff_assoc()
    array (
      'E' => 'f',
      'G' => 'I',
      'k' => 'F',
      'o' => 'p',
    )
    ---
    array_udiff_uassoc()
    array (
      'G' => 'I',
      'k' => 'F',
      'o' => 'p',
    )
    

    【讨论】:

      【解决方案3】:

      array_udiff_assoc — 通过附加索引检查计算数组的差异,通过回调函数比较数据
      array_diff_uassoc — 通过用户提供的回调函数执行的附加索引检查计算数组的差异

      所以,函数的不同之处在于它们使用回调函数的地方。 udiff_assoc 使用回调来比较元素,diff_uassoc 使用回调来比较索引。

      【讨论】:

        猜你喜欢
        • 2010-10-02
        • 2011-12-12
        • 2010-09-16
        • 2012-03-14
        • 2012-02-06
        • 2011-02-25
        • 2011-11-22
        • 2015-03-26
        • 2013-08-19
        相关资源
        最近更新 更多