Eşit değerlere sahip iki diziyi karşılaştırarak (çoğaltılamaz ya da değil, dikkate alarak tip-hokkabazlık) iki yöne array_diff()
a> kullanılarak yapılabilir:
!array_diff($a, $b) && !array_diff($b, $a);
Bu verir TRUE
hem diziler (tip-hokkabazlık sonra) aynı değerleri varsa. FALSE
aksi. Örnekler:
function array_equal_values(array $a, array $b) {
return !array_diff($a, $b) && !array_diff($b, $a);
}
array_equal_values([1], []); # FALSE
array_equal_values([], [1]); # FALSE
array_equal_values(['1'], [1]); # TRUE
array_equal_values(['1'], [1, 1, '1']); # TRUE
Bu örneğin de gösterdiği gibi, array_diff
denklemin dışında dizi anahtarlarını bırakır ve ya değerlerinin sırasına hakkında bakım ve ne değerleri çoğaltılamaz veya değilse ilgili değildir.
Çoğaltma bir fark yapmak varsa, bu daha zor olur. Bildiğim kadarıyla "basit" değerleri ile ilgili olarak (sadece dize ve tamsayı değerleri çalışması), array_count_values()
comes into play to gather information about which value is how often inside an array. This information can be easily compared with ==
:
array_count_values($a) == array_count_values($b);
Bu verir TRUE
iki dizide zaman aynı miktarda (tip-hokkabazlık sonra) aynı değerleri varsa. FALSE
aksi. Örnekler:
function array_equal_values(array $a, array $b) {
return array_count_values($a) == array_count_values($b);
}
array_equal_values([2, 1], [1, 2]); # TRUE
array_equal_values([2, 1, 2], [1, 2, 2]); # TRUE
array_equal_values(['2', '2'], [2, '2.0']); # FALSE
array_equal_values(['2.0', '2'], [2, '2.0']); # TRUE
Bu da nispeten ucuz olduğu ilk iki dizilerin sayısı ve değeri tekrarını sayan bir fark yaptığında en diziler ayrı anlatmak için hızlı bir test karşılaştırarak optimize edilebilir.
Bu örnekler şimdiye kadar kısmen dize ve tamsayı değerleriyle sınırlı ve kesin bir karşılaştırma array_diff
biriyle mümkün olmaktadır. Daha adanmış sıkı karşılaştırma için array_search
. So values need to be counted and indexed so that they can be compared as just turning them into a key (as array_search
) bunu yapmaz yok edilir.
Bu biraz daha eseridir. Ancak sonunda karşılaştırma daha önceki ile aynıdır:
$count($a) == $count($b);
Bu fark sadece $count
o:
$table = [];
$count = function (array $array) use (&$table) {
$exit = (bool)$table;
$result = [];
foreach ($array as $value) {
$key = array_search($value, $table, true);
if (FALSE !== $key) {
if (!isset($result[$key])) {
$result[$key] = 1;
} else {
$result[$key]++;
}
continue;
}
if ($exit) {
break;
}
$key = count($table);
$table[$key] = $value;
$result[$key] = 1;
}
return $result;
};
Iki dizide aynı dizin kullanabilirsiniz böylece bu değerleri bir tablo tutar. Ayrıca erken yeni bir değer yaşanan ikinci dizide ilk defa çıkmak mümkündür.
Bu fonksiyon aynı zamanda ek bir parametre alarak strict içerik ekleyebilirsiniz. Ve başka ek bir parametre ekleyerek daha sonra çiftleri veya arayan etkinleştirmek için izin verecek. Tam örnek:
function array_equal_values(array $a, array $b, $strict = FALSE, $allow_duplicate_values = TRUE) {
$add = (int)!$allow_duplicate_values;
if ($add and count($a) !== count($b)) {
return FALSE;
}
$table = [];
$count = function (array $array) use (&$table, $add, $strict) {
$exit = (bool)$table;
$result = [];
foreach ($array as $value) {
$key = array_search($value, $table, $strict);
if (FALSE !== $key) {
if (!isset($result[$key])) {
$result[$key] = 1;
} else {
$result[$key] += $add;
}
continue;
}
if ($exit) {
break;
}
$key = count($table);
$table[$key] = $value;
$result[$key] = 1;
}
return $result;
};
return $count($a) == $count($b);
}
Kullanım Örnekleri:
array_equal_values(['2.0', '2', 2], ['2', '2.0', 2], TRUE); # TRUE
array_equal_values(['2.0', '2', 2, 2], ['2', '2.0', 2], TRUE); # TRUE
array_equal_values(['2.0', '2', 2, 2], ['2', '2.0', 2], TRUE, FALSE); # FALSE
array_equal_values(['2'], ['2'], TRUE, FALSE); # TRUE
array_equal_values([2], ['2', 2]); # TRUE
array_equal_values([2], ['2', 2], FALSE); # TRUE
array_equal_values([2], ['2', 2], FALSE, TRUE); # FALSE