3

2 つの連想配列があるとします。

<?php
$array1 = array(
    1 => 2,
    2 => 1,
);

$array2 = array(
    2 => 1,
    1 => 2,
);

これらには同じ要素が含まれていますが、順序が異なります。次の場合にのみ true になる比較関数を書きたかったのです。

  1. 配列には同じキー => 値のペアがあります。
  2. ペアの順序は同じです。

だから、私は次のことを試しました:

1 試行

if ($array1 == $array2)
{
    print "equal\n";
}

プリント: 等しい

2回トライ

print count(array_diff_assoc($array1, $array1));

プリント: 0

私のカスタム関数

次に、次の関数を作成しました。

function compare(&$array1, &$array2)
{
    $n1 = count($array1);
    $n2 = count($array2);
    if ($n1 == $n2)
    {
        $keys1 = array_keys($array1);
        $keys2 = array_keys($array2);
        for ($i = 0; $i < $n1; ++$i)
        {
            if ($keys1[$i] == $keys2[$i])
            {
                if ($array1[$keys1[$i]] != $array2[$keys2[$i]])
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
        return true;
    }
    else
    {
        return false;
    }
}

これは正しく動作しますが、ネストされた配列の配列にこの厳密な比較を適用したい場合は!=、この if の演算子のために機能しません。

if ($array1[$keys1[$i]] != $array2[$keys2[$i]])
{
       return false;
}

これは、再帰関数を使用して、データの種類ごとに切り替えることで修正できます。しかし、この簡略化されたバージョンは私にとっては問題ありませんでした。

このタイプの比較の標準的な解決策はありますか?

4

2 に答える 2

6

配列演算子で説明されているように、必要なのは===等価演算子です。

if ($array1 === $array2) {
    echo "same key pairs and same element order\n";
}
于 2013-07-29T12:42:55.470 に答える
0

これを試してみてください。key=>value の場合は true を返し、順序は任意です。それ以外の場合は false を返します

$array1 = array(
1 => 2,
2 => 1);           
$array2 = array(
2 => 1,
1 => 2);

var_dump(compareArray($array1,$array2));

function compareArray ($array1, $array2)
{

foreach ($array1 as $key => $value)

{

if ($array2[$key] != $value)

 {


return false;
}

 }
return true;
 }
于 2013-07-29T12:54:34.157 に答える