В чем разница между 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 использует предоставленные обратные вызовы для сравнения индекса и данных.

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

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

Возможно, набор тестовых примеров прояснит любую путаницу между этими родственными нативными функциями. Я буду последовательно использовать встроенную функцию сравнения без учета регистра. strcasecmp()для упрощения демонстрации/объяснения.

Вот простое английское объяснение того, как будет вести себя каждая функция:

  1. array_diff()- сравнение значений только с учетом регистра
  2. array_diff_key()- сравнения ключей с учетом регистра
  3. array_diff_ukey()- сравнение ключей без учета регистра
  4. array_diff_assoc()- сравнение ключей с учетом регистра и значений с учетом регистра
  5. - * первый попавшийся ключ без учета регистра и сравнение значений с учетом регистра
  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' => '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 использует обратный вызов при сравнении индексов.

Другие вопросы по тегам