В чем разница между array_udiff_assoc и array_diff_uassoc
В чем разница между array_udiff_assoc и array_diff_uassoc
для array_udiff_assoc я получаю эту вещь
<?php
function myfunction($v1,$v2)
{
if ($v1===$v2)
{
return 0;
}
return 1;
}
$a1=array("a"=>"Cat","b"=>"Dog","c"=>"Horse");
$a2=array("a"=>"Cat","b"=>"Horse","c"=>"Dog");
print_r(array_udiff_assoc($a1,$a2,"myfunction"));
?>
результат
Array ( [b] Dog [c] => Horse )
также array_diff_uassoc
<?php
function myfunction($v1,$v2)
{
if ($v1===$v2)
{
return 0;
}
return 1;
}
$a1=array("a"=>"Cat","b"=>"Dog","c"=>"Horse");
$a2=array("a"=>"Cat","b"=>"Horse","c"=>"Dog");
print_r(array_diff_uassoc($a1,$a2,"myfunction"));
?>
результат такой же, как первый
Array ( [b] Dog [c] => Horse )
Есть ли какая-то разница, если есть что это. Руководство Php не говорит, что они являются псевдонимами, как они привыкли говорить.
3 ответа
Они оба делают то же самое, но udiff-assoc
сравнивает данные с пользовательской функцией, в то время как diff-uassoc
сравнивает ИНДЕКС с предоставленной пользователем функцией.
Как ответ на @lonsesomeday: как указано 'u', diff_assoc
будет использовать внутренние функции для всех сравнений, и udiff_uassoc
использует предоставленные обратные вызовы для сравнения индекса и данных.
Возможно, набор тестовых примеров прояснит любую путаницу между этими родственными нативными функциями. Я буду последовательно использовать встроенную функцию сравнения без учета регистра.
strcasecmp()
для упрощения демонстрации/объяснения.
Вот простое английское объяснение того, как будет вести себя каждая функция:
array_diff()
- сравнение значений только с учетом регистраarray_diff_key()
- сравнения ключей с учетом регистраarray_diff_ukey()
- сравнение ключей без учета регистраarray_diff_assoc()
- сравнение ключей с учетом регистра и значений с учетом регистра- - * первый попавшийся ключ без учета регистра и сравнение значений с учетом регистра
array_udiff()
- нечувствительные к регистру сравнения только по значениюarray_udiff_assoc()
- сравнение ключей с учетом регистра и значений без учета регистраarray_udiff_uassoc()
- сравнение ключей без учета регистра и значений без учета регистра
* Обратите особое внимание на то, как 5.
array_diff_uassoc()
ведет себя по-разному в отношении
['c' => 'd']
а также
['m' => 'n']
сравнения из-за порядка квалифицирующих вхождений в
$second
множество.
Код: (Демо )
$first = [
'A' => 'B',
'c' => 'd',
'E' => 'f',
'g' => 'H',
'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',
'o' => 'p',
)
---
array_diff_key()
array (
'E' => 'f',
'g' => 'H',
'k' => 'F',
'o' => 'p',
)
---
array_diff_ukey()
array (
'k' => 'F',
)
---
array_diff_assoc()
array (
'A' => 'B',
'c' => 'd',
'E' => 'f',
'g' => 'H',
'k' => 'F',
'm' => 'n',
'o' => 'p',
)
---
array_diff_uassoc()
array (
'A' => 'B',
'E' => 'f',
'k' => 'F',
'm' => 'n',
'o' => 'p',
)
---
array_udiff()
array (
'o' => 'p',
)
---
array_udiff_assoc()
array (
'E' => 'f',
'g' => 'H',
'k' => 'F',
'o' => 'p',
)
---
array_udiff_uassoc()
array (
'k' => 'F',
'o' => 'p',
)
array_udiff_assoc
- Вычисляет разницу массивов с дополнительной проверкой индекса, сравнивает данные с помощью функции обратного вызова.array_diff_uassoc
- Вычисляет разницу массивов с дополнительной проверкой индекса, которая выполняется с помощью предоставленной пользователем функции обратного вызова.
Таким образом, функция отличается в том месте, где они используют функцию обратного вызова. udiff_assoc использует обратный вызов для сравнения элементов, diff_uassoc использует обратный вызов при сравнении индексов.