PHP: İki Dizi değerleri eşit olup olmadığını kontrol etmek için Built-in fonksiyonu (Order almamak)

7 Cevap php

Bana iki dizileri aynı değerleri (sırası önemli değil?) Içeren olup olmadığını kontrol etmek için PHP için yerleşik bir işlevi yoktur.

Örneğin, ben şu iki girişler için bana true döndüren bir işlev istiyorum:

array('4','5','2') 
array('2','4','5')

Edit: I could have sorted the two arrays and compare them, but as I am such a lazy guy, I would still prefer a one-liner that I can pull out and use.

7 Cevap

array_diff bir seçenek gibi görünüyor:

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

ya da kodunda bir OneLiner olarak:

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

En iyi çözüm dizisi hem sıralamak ve daha sonra bunları karşılaştırmak için:

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

Bir fonksiyonu olarak:

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

İşte her elemanı için arayan başka bir algoritma var A o öyle ise 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;
}

Ancak bu bir karmaşıklık var O (n ^ 2). Böylece daha iyi sıralama yöntemini kullanın.

Yukarıda array_diff() yöntem işe yaramaz.

php.net 'in manuel array_diff() bunu yapar diyor:

"Diğer dizilerin hiçbirinde mevcut olmayan tüm dizi1 girdileri içeren bir dizi döndürür."

Yani gerçek array_diff() yöntem olacaktır:

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

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

D: Ben sıralama yöntemi ile gitmek Ancak

Sen array_diff kullanabilirsiniz.

$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
}

Ancak, bu yaklaşımın bir sorunu diziler yinelenen öğeleri içeren ve hala maç olabilir.

Onun == veya === kullanmak kadar kolay.

($ A == $ b) DOĞRU $ a ve $ b aynı anahtar / değer çiftleri varsa.

($ A === $ b) DOĞRU $ a ve $ b aynı düzende ve aynı tipleri aynı anahtar / değer çiftleri varsa.

http://php.net/manual/en/language.operators.array.php

if (count ($ a1) == sayısı ($ a2) &&! array_diff ($ a1, $ a2))

Kullanmak array_intersect() yerine array_diff() yapabilirsiniz:

$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)) );

Performans açısından. iki faktör önemlidir çözüm:

  • daha sık dizileri eşleşen, daha array_intersect() hızlıdır.
  • Daha diziler (10'dan fazla değerleri) büyük, daha array_intersect() hızlı.

Bu faktörlere bağlı olarak, tek bir yöntem, iki ya da üç kez diğerinden daha hızlı olabilir. Az (veya hiç) eşleme kombinasyonları, ya da eşleştirme dolu küçük diziler ile büyük diziler için, her iki yöntem eşdeğerdir.

Ancak, sıralama yöntemi az veya hiç eşleşen kombinasyonları ile küçük dizilerle durumlar dışında, daha hızlı her zaman. Bu durumda, array_diff() yöntemi,% 30 daha hızlıdır.