PHP-2つの配列が等しいかどうかを確認する


280

2つの配列が等しいかどうかを確認したいと思います。つまり、同じサイズ、同じインデックス、同じ値です。どうやってやるの?

使用して!==、ユーザにより示唆されるように、私は次のように印刷するだろうと期待して入力して、アレイ内の少なくとも一つの要素(複数可)が異なっているが、実際にはそれがない場合。

if (($_POST['atlOriginal'] !== $oldAtlPosition) 
    or ($_POST['atl'] !== $aext) 
    or ($_POST['sidesOriginal'] !== $oldSidePosition) 
    or ($_POST['sidesOriginal'] !== $sideext)) {

    echo "enter";
}

17
あなたが使用している=あまり、それがあるべき!==!=
のJeroen

29
:ちょうど(私の編集は、「ユーザー」に背を変えてしまったので)それが「ユーザー」であるレコードのenglish.stackexchange.com/questions/105116/...
teynon

7
['a'] == [0]ですtrue。まあ、これは単なるPHPです。
デイビット・ホーバス

2
@DávidHorváthそれは本当に奇妙です、それを常に使用することをお勧めします===
AFA Med

1
@DávidHorváth、緩い比較はPHPだけでなく緩いです。JSを見ると驚かれることでしょう。物事をよりよく理解するまで使用しないでください。
ryabenko-pro

回答:


508
$arraysAreEqual = ($a == $b); // TRUE if $a and $b have the same key/value pairs.
$arraysAreEqual = ($a === $b); // TRUE if $a and $b have the same key/value pairs in the same order and of the same types.

配列演算子を参照してください。

編集

不等式演算子は!=、非同一性演算子が!==等値演算子==と同一性演算子を一致させるためのもの===です。


79
サイドノート:このアプローチは、作品だけでなく、多次元配列のために(それは前に私のためにあることは明らかではなかったです)。
trejder 2013

5
PS:解決策は使用することarray_values($a)==array_values($b)です...別の通常の問題は一意の値に関するものなので、存在することを覚えておいてくださいarray_unique()
Peter Krauss、2014年

13
この答えは間違っています。==のような一般的な辞書に対してのみ、順序に関係なく機能し[1 => 'a', 2 => 'b']ます。たとえば[1 => 'a', 2 => 'b'] == [2 => 'b', 1 => 'a']。のようにインデックス付き配列の場合['a', 'b'] ==は動作しません。たとえば['a', 'b'] != ['b', 'a']
nawfal 2015年

37
@nawfal:あなたの仮定は間違っています。['a', 'b']アレイである[0 => 'a', 1 => 'b']が、 ['b', 'a']アレイです[0 => 'b', 1 => 'a']。そのため、私の回答に記載されているのと同じキーと値のペアがあり==ません。そのため、それらの間では機能しません。
Stefan Gehrig

29
@StefanGehrigああ、そうだね。私の愚かさを明白にするために、コメントはそのままにしておきます:)
nawfal 2015年

88

このページによると。

注:受け入れられた回答は連想配列では機能しますが、インデックス付き配列では期待どおりに機能しません(以下で説明します)。それらのいずれかを比較する場合は、このソリューションを使用します。また、この関数は(array_diff関数の性質により)多次元配列では機能しない場合があります。

要素の順序が異なる2つのインデックス付き配列を使用して、$a == $bまたは$a === $b失敗してテストします。次に例を示します。

<?php
    (array("x","y") == array("y","x")) === false;
?>

上記の意味は次のとおりです。

array(0 => "x", 1 => "y")array(0 => "y", 1 => "x")

この問題を解決するには、以下を使用します。

<?php
function array_equal($a, $b) {
    return (
         is_array($a) 
         && is_array($b) 
         && count($a) == count($b) 
         && array_diff($a, $b) === array_diff($b, $a)
    );
}
?>

速度を向上させる可能性があるため、配列サイズの比較が追加されました(super_tonによって推奨)。



8
上記のコメントは誤りです。$ bに$ aのすべての要素といくつかの追加の要素がある場合、2つの配列は等しくありませんが、上記のコードは等しいとしています。
Ghola 2014

1
count($ a)== count($ b)も追加する価値があるかもしれません
stefan

1
@super_ton:はい、呼び出す前array_diffに比較を高速化できます。追加します。ありがとう
lepe 2016

3
残念ながら、これは一部のケースでは機能しません。たとえば、次のケースでテストした$a = [1, 2, 2]; $b = [2, 1, 1];ところtrue、が返されましたが、2つの配列は明らかに同じではありません。
AwesomeGuy 2018

33

シリアライズしてみてください。これにより、ネストされたサブ配列もチェックされます。

$foo =serialize($array_foo);
$bar =serialize($array_bar);
if ($foo == $bar) echo "Foo and bar are equal";

7
比較を使用する場合と同様に、キーと値がシフトする場合に問題があります。ただし、それらが100%同じであると想定されている場合、これが深い等価性をチェックする最もクリーンで簡単な方法です。
Kevin Peno 2013

1
これが最善の解決策だと思います!以前に並べ替えられていた場合は、多次元の連想配列を比較できます。
Rafael Moni

13

キーが異なる順序で指定されている配列でも機能する短いソリューション:

public static function arrays_are_equal($array1, $array2)
{
    array_multisort($array1);
    array_multisort($array2);
    return ( serialize($array1) === serialize($array2) );
}

3
おそらくこれまでのところ最良の答えです。キーがシフトされている場合、または多次元配列の場合、ほとんどの答えは一致しません。
AwesomeGuy 2018


9

!===構文エラーのため機能しません。正しい方法は!==(3つの「等しい」記号ではない)です。


5
if (array_diff($a,$b) == array_diff($b,$a)) {
  // Equals
}

if (array_diff($a,$b) != array_diff($b,$a)) {
  // Not Equals
}

私の視点では、array_diffを使用する方がarray_intersectよりも優れています。これは、この性質のチェックにより、返される差異は一般に類似性よりも低くなるため、ブール変換によりメモリの消費が少なくなるためです。

編集このソリューションは、単なる配列のためのものであり、その上に掲載==と=== 1を補完することに注意が辞書にのみ有効です。


4

array_diff —配列の差を計算する

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

array array_diff ( array $array1 , array $array2 [, array $... ] )

array11つ以上の他の配列と比較しarray1、他の配列には存在しない値を返します。


4
OPは、「2つのアレイが等しいかどうかを確認」したいと考えています。array_diffそれはあなたには言えません。お試しくださいarray_diff([1, 2], [1, 2, 'hello'])
marcv 16

3

値の順序に関係なく同等性をチェックする別の方法は、次のようにhttp://php.net/manual/en/function.array-intersect.phpを使用して機能します。

$array1 = array(2,5,3);
$array2 = array(5,2,3);
if($array1 === array_intersect($array1, $array2) && $array2 === array_intersect($array2, $array1)) {
    echo 'Equal';
} else {
    echo 'Not equal';
}

これは、http://php.net/manual/en/function.array-uintersect.phpを使用して多次元配列でも機能するバージョンです。

$array1 = array(
    array(5, 2),
    array(3, 6),
    array(2, 9, 4)
);
$array2 = array(
    array(3, 6),
    array(2, 9, 4),
    array(5, 2)
);

if($array1 === array_uintersect($array1, $array2, 'compare') && $array2 === array_uintersect($array2, $array1, 'compare')) {
    echo 'Equal';
} else {
    echo 'Not equal';
}

function compare($v1, $v2) {
    if ($v1===$v2) {
        return 0;
    }
    if ($v1 > $v2) return 1;
    return -1;
}

3
function compareIsEqualArray(array $array1,array $array):bool
{

   return array_diff($array1,$array2)==[];

}

2
コード例が何をしているかを説明することは役に立ちます。これは多次元配列でも機能しますか?
k0pernikus

1
array_diff戻り空の配列2の配列が等しい場合array_diff配列とは異なる要素を取得
dılosürücü

2

1つの方法:(http://tools.ietf.org/html/rfc6902#section-4.6の 'considered equal'の実装)

この方法により、メンバーの順序が異なる連想配列が可能になります。たとえば、phpを除くすべての言語で等しいと見なされます。

// recursive ksort
function rksort($a) {
  if (!is_array($a)) {
    return $a;
  }
  foreach (array_keys($a) as $key) {
    $a[$key] = ksort($a[$key]);
  }
  // SORT_STRING seems required, as otherwise
  // numeric indices (e.g. "0") aren't sorted.
  ksort($a, SORT_STRING);
  return $a;
}


// Per http://tools.ietf.org/html/rfc6902#section-4.6
function considered_equal($a1, $a2) {
  return json_encode(rksort($a1)) === json_encode(rksort($a2));
}

1
私はあなたがそうあるべきだと信じています:$a[$key] = rksort($a[$key]);
pinkeen

2

アレイの構文問題

$array1 = array(
    'a' => 'value1',
    'b' => 'value2',
    'c' => 'value3',
 );

$array2 = array(
    'a' => 'value1',
    'b' => 'value2',
    'c' => 'value3',
 );

$diff = array_diff($array1, $array2);

var_dump($diff); 

2

配列と比較して、それらの違いを取得する方法の例を次に示します。

$array1 = ['1' => 'XXX', 'second' => [
            'a' => ['test' => '2'],
            'b' => 'test'
        ], 'b' => ['no test']];

        $array2 = [
            '1' => 'XX',
            'second' => [
                'a' => ['test' => '5', 'z' => 5],
                'b' => 'test'
            ],
            'test'
        ];


        function compareArrayValues($arrayOne, $arrayTwo, &$diff = [], $reversed = false)
        {
            foreach ($arrayOne as $key => $val) {
                if (!isset($arrayTwo[$key])) {
                    $diff[$key] = 'MISSING IN ' . ($reversed ? 'FIRST' : 'SECOND');
                } else if (is_array($val) && (json_encode($arrayOne[$key]) !== json_encode($arrayTwo[$key]))) {
                    compareArrayValues($arrayOne[$key], $arrayTwo[$key], $diff[$key], $reversed);
                } else if ($arrayOne[$key] !== $arrayTwo[$key]) {
                    $diff[$key] = 'DIFFERENT';
                }
            }
        }

        $diff = [];
        $diffSecond = [];

        compareArrayValues($array1, $array2, $diff);
        compareArrayValues($array2, $array1, $diffSecond, true);

        print_r($diff);
        print_r($diffSecond);

        print_r(array_merge($diff, $diffSecond));

結果:

Array
(
    [0] => DIFFERENT
    [second] => Array
        (
            [a] => Array
                (
                    [test] => DIFFERENT
                    [z] => MISSING IN FIRST
                )

        )

    [b] => MISSING IN SECOND
    [1] => DIFFERENT
    [2] => MISSING IN FIRST
)

1

PHP関数array_diff(array1、array2);を使用します。

配列間の違いを返します。空の場合、それらは等しいです。

例:

$array1 = array(
    'a' => 'value1',

    'b' => 'value2',

    'c' => 'value3'
 );

$array2 = array(
    'a' => 'value1',

    'b' => 'value2',

    'c' => 'value4'
 );

$diff = array_diff(array1, array2);

var_dump($diff); 

//it will print array = (0 => ['c'] => 'value4' ) 

例2:

$array1 = array(
    'a' => 'value1',

    'b' => 'value2',

    'c' => 'value3',
 );

$array2 = array(
    'a' => 'value1',

    'b' => 'value2',

    'c' => 'value3',
 );

$diff = array_diff(array1, array2);

var_dump($diff); 

//it will print empty; 

1
技術的には、配列間の違いは返されません。ドキュメントには、「array1を1つ以上の他の配列と比較し、他の配列には存在しないarray1の値を返す」と記載されています。したがって、array1のすべての値がarray2に存在する場合、array2にさらに値がある場合でも、array_diffは空の配列を返します
2pha

「nullを出力」せず、空の配列を出力します(約12の構文エラーを修正した後)。たぶん(count(array_diff($a1, $a2)) + count(array_diff($a2, $a1))) === 0、配列が「等しい」かどうかをテストするために使用できます
user9645

構文を修正しました(nullは空ではなく、コンマを混ぜていました-.-)。あなたが提案していることは多すぎると思います。空の配列で十分かどうかを確認しています。
Wolfgang Leon

1

非連想配列をチェックしたい場合は、解決策は次のとおりです。

$a = ['blog', 'company'];
$b = ['company', 'blog'];

(count(array_unique(array_merge($a, $b))) === count($a)) ? 'Equals' : 'Not Equals';
// Equals
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.