6

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マニュアルには、それらが相互のエイリアスであるとは記載されていません。

4

3 に答える 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

于 2012-02-02T17:43:49.033 に答える
4

おそらく、一連のテストケースによって、これらの関連するネイティブ機能間の混乱が解消されます。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()-大文字と小文字を区別しないキーと大文字と小文字を区別しない値の比較

*配列内の修飾オカレンスの順序により、および比較array_diff_uassoc()に関して5.がどのように異なる動作をするかに細心の注意を払ってください。['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',
)
于 2022-01-22T22:17:09.033 に答える
0

array_udiff_assoc—追加のインデックスチェックを使用して配列の差を計算し、コールバック関数によってデータを比較します
array_diff_uassoc—ユーザーが指定したコールバック関数によって実行される追加のインデックスチェックを使用して配列の差を計算します

そのため、コールバック関数を使用する場所が関数によって異なります。udiff_assocはコールバックを使用して要素を比較し、diff_uassocはインデックスを比較するときにコールバックを使用します。

于 2012-02-02T17:45:49.160 に答える