PHP dizi karşılaştırmak

12 Cevap php

Döngü çeşit yapmanın kısa bir dahili fonksiyonunu kullanarak php dizileri karşılaştırmak için yine de var mı?

$a1 = array(1,2,3);
$a2 = array(1,2,3);

if (array_are_same($a1, $a2)) {
    // code here
}

BTW, dizi değerleri her zaman aynı sırayla olmayacaktır.

12 Cevap

@ Cleanshooter Üzgünüm ama bunu yapmaz, bu todo ne bekleniyor: (yani array_diff bu bağlamda söz yok)

$a1 = array('one','two');
$a2 = array('one','two','three');

var_dump(count(array_diff($a1, $a2)) === 0); // returns TRUE

(annotation: you cannot use empty on functions before PHP 5.5) in this case the result is true allthough the arrays are different.

array_diff [...] diğer dizilerin hiçbirinde mevcut olmayan tüm dizi1 girdileri içeren bir dizi döndürür.

array_diff gibi bir şey olduğu anlamına gelmez ki: array_get_all_differences. Matematiksel setleri Açıklaması bu hesaplar:

{'one','two'} \ {'one','two','three'} = {}

which means something like all elements from first set without all the elements from second set, which are in the first set. So that

var_dump(array_diff($a2, $a1));

için hesaplar

array(1) { [2]=> string(5) "three" } 

Sonuç Eğer iki diziler tüm "farklılıkları" almak için "iki yönden" bir array_diff yapmak zorunda olmasıdır.

Bu yardımcı olur umarım :)

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() 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

Sadece kontrol $a1 == $a2 - Ne o nesi var?

Herhangi bir sırada olabilir dizi değerleri karşılaştırma için bir hızlı yöntem ...

function arrays_are_same($array1, $array2) {
    sort($array1);
    sort($array2);
    return $array1==$array2;
}

Yani için ...

    $array1 = array('audio', 'video', 'image');
    $array2 = array('video', 'image', 'audio');

arrays_are_same($array1, $array2) döndürür TRUE

Burada Anlatım gelen sonuç:

(Tür Dönüşümü sonra) eşit ve sadece aynı sırada olan dizi değerlerinin karşılaştırılması:

array_values($a1) == array_values($a2)

(Tip hokkabazlık sonra) eşit ve aynı ve aynı sırayla olmanın aynı düzen ve dizi anahtarları olma dizi değerlerinin karşılaştırılması:

array_values($a1) == array_values($a2) && array_keys($a1) == array_keys($a2)

saymak kavşaklar kaynak diziler hem de aynı olduğunu doğrulamak

$intersections = array_intersect($a1, $a2);
$equality = (count($a1) == count($a2)) && (count($a2) == count($intersections)) ? true : false;

İki dizide değerlerini karşılaştırın:

$a = array(1,2,3);
$b = array(1,3,2);

if (array_diff($a, $b) || array_diff($b, $a)) {
    echo 'Not equal';
}else{
    echo 'Equal';
}

hem de dizileri sıralamak için kullanıcı veya giriş dizi values.Use sıralama işlevi, dizi olsun. üçlü operatörü kullanılarak kontrol edin. Hem diziler eşit ise diziler bu diziler eşit değildir basacaktır başka eşittir basacaktır. Burada döngü yineleme yoktur.

sort($a1);
sort($a2);
echo (($a1==$a2) ? "arrays are equal" : "arrays are not equal");

Ayrıca bu şekilde deneyebilirsiniz:

if(serialize($a1) == serialize($a2))

Bu deneyin:

$array1 = array("street" => array("Althan"), "city"   => "surat", "state"  => "guj", "county" => "india");
        $array2  = array("street" => array("Althan"), "city"   => "surat", "state"  => "guj", "county" => "india");

    if (array_compare($array1, $array2))
    {
             echo "<pre>";
             print_r("succsses..!");
             echo "</pre>";
             exit;

    }
    else
    {
            echo "<pre>";
            print_r("Faild..!");
            echo "</pre>";
            exit;
    }

    function array_compare($op1, $op2)
    {

            foreach ($op1 as $key => $val)
            {
                    if (is_array($val))
                    {
                            if (array_compare($val, $op2[$key]) === FALSE)
                                    return false;
                    }
                    else
                    {

                            if (!array_key_exists($key, $op2))
                            {
                                    return false; // uncomparable
                            }
                            elseif ($val < $op2[$key])
                            {
                                    return false;
                            }
                            elseif ($val > $op2[$key])
                            {
                                    return false;
                            }
                    }
            }
            return true; // $op1 == $op2
    }

Bildiğim kadarıyla söyleyebilirim, ancak, sizin için böyle bir şey yapacağım, tek bir yerleşik işlevi yoktur:

if (count($a) == count($b) && (!count(array_diff($a, $b))) {
  // The arrays are the same
}

Hile yapmak gerekir