PHP çoğaltılamaz 2-boyut dizi nasıl kaldırılır?

5 Cevap php

Ben her $ dizi [$ i] için bir karma değer verme bahsediyoruz, ve sonra benzersiz dizisini almak için karma karşılaştırmak edildi önceki mesajların bazı fikir var, ama ben tam olarak ne yapabilirim bilmiyorum.

Benim örnek dizisi Veri:

$arr[] = array(0,1,2,3);
$arr[] = array(4,5,2,1);
$arr[] = array(0,0,0,0);
$arr[] = array(0,1,2,3);

Ben dönmek bekleniyor:

$arr[] = array(0,1,2,3);
$arr[] = array(4,5,2,1);
$arr[] = array(0,0,0,0);

Herkes bana bu amaçla bir işlevi gönderebilir miyim?

Çok teşekkürler!

5 Cevap

Hızlı ve basit:

$arr = array_map('unserialize', array_unique(array_map('serialize', $arr)));
foreach($arr as $key => $value)
{
   foreach($arr as $key2 => $value2)
   {
      if($value2 == $value && $key != $key2)
       {
          unset($arr[$key]);
       }
    }
}

Bu en zarif yöntemi değildir, ancak bunu yapmanız gereken tam olarak ne yapar. Sorun özyinelemeli array_unique kullanabilirsiniz olamaz.

Bu PHP.net documentation comments (orada Büyük Kod Parçacıkları) adlı başka bir yoludur

function arrayUnique($myArray) 
{ 
    if(!is_array($myArray)) 
           return $myArray; 

    foreach ($myArray as &$myvalue){ 
        $myvalue=serialize($myvalue); 
    } 

    $myArray=array_unique($myArray); 

    foreach ($myArray as &$myvalue){ 
        $myvalue=unserialize($myvalue); 
    } 

    return $myArray; 

}

İşte başka bir fikir. Yine, korkunç zarif değil, ama oldukça hızlı olabilir. Sadece alt dizide interger değerleri varsa daha hızlı olacağını rağmen, Chacha102 ikinci bölümüne benzer.

// implode the sub arrays
$tmpArray = array();
foreach ($arr as $key => $array) {
    $tmpArray[$key] = implode(',', $array);
}

// get only the unique values
$tmpArray = array_unique($tmpArray);

// explode the values
$arr = array();
foreach ($tmpArray as $key => $string) {
    $arr[$key] = explode(',', $string);
}

Karma, ortalama çözüm O (n) olur, iyi bir fikirdir

Temelde $ arr yineleme ve tüm dizinin bir karma yapmak ve sonra bu O m nerede hassas olması (1)) (isset kullanarak, ya da O (m) (gezdiğiniz önceki karmaları karşı karşılaştırmak İç dizideki öğelerin) sayısı. bir çarpışma varsa ve sen gerçek dizi öğelerini karşılaştırın. genellikle bir çarpışma önce bu diziyi gördüm demektir ve bir yinelenen, ama bu garanti değil. Burada bu algoritmayı uygulayan bazı psuedo php bulunuyor.

function mkhash($array = array()) {
   $hash = "";
   foreach ($array as $element) {
      $hash .= md5($element);
   }
}

$seen = array();
$newArray = array();
foreach($arr as $elementArray) {
   $hash = mkhash($elementArray); 
   if(!isset($seen[$hash])) {
     $newArray[] = $elementArray;
     $seen[$hash] = $elementArray;
   } else if(count(array_diff($elementArray, $seen[$hash])) > 0) {
      $newArray[] = $elementArray; //this is true if two different arrays hashed to the same element
   }
}

Karma yöntemi uygulamak zordur ve çarpışmalar ile ilgili düzgün zor, bu yüzden O (nlogn) var.

Bunu yapmanın O (nlogn) yol diziyi sıralamak olacaktır

$arr = array_multisort($arr); //O(nlogn)

Ve o zaman yapmanız gerekir hepsi çoğaltmaları olup olmadığını görmek için bitişik dizileri karşılaştırmak olduğunu

Tabii ki sadece O kullanabilirsiniz (n ^ 2) yaklaşımı ve diğer her iç dizi her iç dizi karşılaştırabilirsiniz ...

EDIT: oh ve burada başka bir O (n) bir fikir, özyinelemeli diğer diziler Haritayı dizi tuşlarını kullanarak bir tray inşa edebilirsiniz, böylece m var uzun iç dizisi olan m-düzey derin dizi ile sonuna kadar. Tray her dal eşsiz bir iç diziyi temsil eder. Tabii ki geri 2D diziye traydan dönüştürmek için bazı havai kod yazmak zorunda olurdu, böylece giriş önem düzeyi çok büyük olana kadar performans yararı göremezsiniz!

Eğer (yani temelde, bu döngü sırasında şişkinlik önlemek için yalnızca benzersiz değerleri istiyorsanız bağlıdır, ya da bellekte büyük dizi tutmak kaynaklara sahip eğer bağlıdır, sadece bir dizi olarak nihai sonucu gerekiyorsa benzersiz değerler.

Tüm örnekler için, sana değerlerin bir MySQL sorgu gibi, bazı dış kaynaktan büyük diziye girmek için alıyorsanız varsayalım.

Ana diziye girilen çoğaltmaları önlemek için:

Siz iki dizi, bir dize olarak değerlerle bir gerçek dizi değerleri olarak değerleri ile bir oluşturabilirsiniz.

while($row = $results->fetch_assoc) {
     $value_string = implode("," $row);
     if(in_array($value_string, $check_array) {
         $check_array[] = $value_string;
         $master_array[] = $row;
      }
 }

Veri setinin dize sürümü dize veri kümelerinin dizide zaten iterated ise yukarıda, sadece görür. İki diziler ile büyük bir yükü ile sonuna kadar, ama ne hiç yinelenen değerleri alır.

Ya da, daha önce de belirttiğim gibi, ben eminim, tüm veriler girildikten sonra olur ki, array_unique var. Yukarıdaki örneği değiştirme, olsun

while($row = $results->fetch_assoc) {
     $master_array[] = $row;
   }
 $master_array = array_unique($master_array);