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

问题描述 投票:0回答:3

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手册中并没有说它们是彼此的别名。

php arrays associative custom-function array-difference
3个回答
6
投票

他们都做同样的事情,但是

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


5
投票

也许一组测试用例会消除这些相关本机功能之间的任何混淆。我会一直使用原生的不区分大小写的比较函数

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
数组中符合条件的出现顺序。

代码:(演示

$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',
)

0
投票

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

所以,函数在使用回调函数的地方有所不同。 udiff_assoc 使用回调来比较元素,diff_uassoc 在比较索引时使用回调。

© www.soinside.com 2019 - 2024. All rights reserved.