/ / PHP:2つの配列値が等しいかどうかをチェックする組み込み関数(順序を無視) - php、配列

PHP:2つの配列の値が等しいかどうかをチェックする組み込み関数(順序を無視する) - PHP、配列

2つの配列に同じ値が含まれているかどうかをチェックするためのPHP用の組み込み関数はありますか(順序は重要ではありません)。

たとえば、次の2つの入力に対して真を返す関数が必要です。

array("4","5","2")
array("2","4","5")

編集:私は2つの配列を並べ替えて比較することもできましたが、私はとても怠け者なので、引き抜いて使用できるワンライナーをお勧めします。

回答:

回答№1の場合は29

array_diff オプションのように見えます:

function array_equal($a1, $a2) {
return !array_diff($a1, $a2) && !array_diff($a2, $a1);
}

またはあなたのコードのonelinerとして:

if(!array_diff($a1, $a2) && !array_diff($a2, $a1)) doSomething();

回答№2のための7

最良の解決策は、両方の配列をソートしてからそれらを比較することです。

$a = array("4","5","2");
$b = array("2","4","5");
sort($a);
sort($b);
var_dump($a === $b);

関数として:

function array_equal($a, $b, $strict=false) {
if (count($a) !== count($b)) {
return false;
}
sort($a);
sort($b);
return ($strict && $a === $b) || $a == $b;
}

これは、の各要素を探す別のアルゴリズムです。 A それが B

function array_equal($a, $b, $strict=false) {
if (count($a) !== count($b)) {
return false;
}
foreach ($a as $val) {
$key = array_search($val, $b, $strict);
if ($key === false) {
return false;
}
unset($b[$key]);
}
return true;
}

しかし、それは複雑さを持っています On^ 2)。だからあなたはより良いソート方法を使用する。


回答№3の場合は3

array_diff() 上記の方法では、 "t t work"を達成できませんでした。

php.netのマニュアルには array_diff() これを行う:

「他のどの配列にも存在しないarray1からのすべてのエントリを含む配列を返します。」

だから実際 array_diff() メソッドは次のようになります。

function array_equal($array1, $array2)
{
$diff1 = array_diff($array1, $array2);
$diff2 = array_diff($array2, $array1);

return
(
(count($diff1) === 0) &&
(count($diff2) === 0)
);
}

しかし、私はソート方法で行きます:D


答え№4の2

array_diffを使うことができます。

$a = array("4","5","2");
$b = array("2","4","5");

if(count(array_diff($a, $b)) == 0) {
// arrays contain the same elements
} else {
// arrays contain different elements
}

ただし、この方法の問題は、配列に重複した要素が含まれていても一致する可能性があることです。


回答№5の場合は1

あなたは一方向を使用して比較する必要があります array_diff() 使用する count() 逆の関係のために。

if (count($a1) == count($a2) && !array_diff($a1, $a2)) {
// equal arrays
}

答え№6の場合は0

あなたは使うことができます array_intersect() の代わりに array_diff()

$a = array("4","5","2");
$b = array("2","4","5");
$ca = count($a);
$cb = count($b);
$array_equal = ( $ca == $cb && $ca == count(array_intersect($a, $b)) );

パフォーマンスは賢い。 2つの要因が重要です。

  • より頻繁に配列がマッチするほど、より多くの array_intersect() 速いです。
  • 配列が大きいほど(10個以上の値)、より多くの array_intersect() 速いです。

これらの要因に応じて、1つの方法は2つの方法がありますまたは他の3倍速い。一致の組み合わせがほとんどない(またはまったくない)大きな配列、または多くの一致がある小さな配列では、どちらの方法も同等です。

ただし、ソート方法は常に高速です。一致する組み合わせがほとんどない、またはまったくない小さな配列の場合を除きます。この場合 array_diff() 方法は30%高速です。


回答№7は0

比較対象の配列が文字列または整数、あるいはその両方で構成されている場合、 array_count_values 配列をすばやく比較できます O(n) 時間vs O(n log n) 両方の配列に同じ値が含まれていることと、各値が両方の配列で同じ回数出現することを確認して、並べ替え)

if(array_count_values($a1) == array_count_values($a2)) {
//arrays are equal
}