Cara menghapus nilai duplikat dari array di PHP

155

Bagaimana saya bisa menghapus nilai duplikat dari array di PHP?

Ian
sumber

Jawaban:

251

Gunakan array_unique () .

Contoh:

$array = array(1, 2, 2, 3);
$array = array_unique($array); // Array is now (1, 2, 3)
Jeremy Ruten
sumber
20
@Ian -Note that array_unique() is not intended to work on multi dimensional arrays.
Peter Ajtai
18
Di atas akan mempertahankan kunci elemen. Jika Anda ingin mereka diindeks ulang, sebagai tambahan terapkan array_values: php.net/manual/en/function.array-values.php
CodeVirtuoso
3
Ini tidak berhasil bagi saya dengan baik menggunakan: $array = array_unique($array, SORT_REGULAR);
iniravpatel
@PeterAjtai: Terima kasih telah menyoroti di bagian komentar. Ini menghemat banyak waktu bagi saya.
Nana Partykar
29

Menggunakan array_values(array_unique($array));

array_unique: untuk array unik array_values: untuk pengindeksan ulang

nimey sara thomas
sumber
1
+1 array_uniquemengembalikan objek dengan pasangan kunci dan nilai DAN array_valueshanya mengembalikan nilai sebagai array.
narainsagar
24
//Find duplicates 

$arr = array( 
    'unique', 
    'duplicate', 
    'distinct', 
    'justone', 
    'three3', 
    'duplicate', 
    'three3', 
    'three3', 
    'onlyone' 
);

$unique = array_unique($arr); 
$dupes = array_diff_key( $arr, $unique ); 
    // array( 5=>'duplicate', 6=>'three3' 7=>'three3' )

// count duplicates

array_count_values($dupes); // array( 'duplicate'=>1, 'three3'=>2 )
chim
sumber
9

Satu-satunya hal yang berhasil bagi saya adalah:

$array = array_unique($array, SORT_REGULAR);

Sunting: SORT_REGULARmenjaga urutan yang sama dari array asli.

iniravpatel
sumber
8
$result = array();
foreach ($array as $key => $value){
  if(!in_array($value, $result))
    $result[$key]=$value;
}
Amr Berag
sumber
5

terkadang array_unique()bukan itu caranya, jika Anda ingin mendapatkan item unik DAN duplikat ...

$unique=array("","A1","","A2","","A1","");
$duplicated=array();

foreach($unique as $k=>$v) {

if( ($kt=array_search($v,$unique))!==false and $k!=$kt )
 { unset($unique[$kt]);  $duplicated[]=$v; }

}

sort($unique); // optional
sort($duplicated); // optional

hasil pada

array ( 0 => '', 1 => 'A1', 2 => 'A2', ) /* $unique */

array ( 0 => '', 1 => '', 2 => '', 3 => 'A1', ) /* $duplicated */
AgelessEssence
sumber
3

Kita dapat membuat jenis array untuk menggunakan nilai terakhir ini akan diperbarui ke kolom atau nilai kunci dan kita akan mendapatkan nilai unik dari array ...

$array = array (1,3,4,2,1,7,4,9,7,5,9);
    $data=array();
    foreach($array as $value ){

        $data[$value]= $value;

    }

    array_keys($data);
    OR
    array_values($data);
kumar yang keras
sumber
2

explode(",", implode(",", array_unique(explode(",", $YOUR_ARRAY))));

Ini akan menangani asosiasi kunci dan membuat serialisasi kunci untuk array baru yang dihasilkan :-)

Deb
sumber
1
Apa yang akan menjadi efek explode("," $YOUR_ARRAY)saat $YOUR_ARRAYini array("1", "2", "3")?
kiamlaluno
@kiamlaluno - :) dan jawabannya adalah: Peringatan: meledak () mengharapkan parameter 2 menjadi string, array yang diberikan dalam ... on line ....
Jesse Chisholm
@JesseChisholm Ya, ini intinya, tapi tidak ada yang memperhatikan kode itu, rupanya.
kiamlaluno
2

Tergantung pada ukuran array Anda, saya telah menemukan

$array = array_values( array_flip( array_flip( $array ) ) );

bisa lebih cepat dari array_unique.

Bollis
sumber
Setiap informasi lebih lanjut tentang apa yang terjadi di sini dan apakah akan lebih cepat dengan array yang lebih besar atau lebih kecil.
Fi Horan
Flip ganda akan menghapus nilai duplikat, karena kunci tidak bisa ada dua kali, jika tidak ditimpa. Jika ada nilai yang diduplikasi dan array dibalik, kejadian terakhir (saya berasumsi) akan menjadi nilai untuk kunci.
Goldentoa11
Dalam PHP 7 saya perhatikan membalik array multidimensi lebih dari sekali dapat menyusun ulang elemen array secara tak terduga.
Josh Habdas
1

Itu cara yang bagus untuk melakukannya. Mungkin ingin memastikan hasilnya kembali array lagi. Sekarang Anda hanya menunjukkan nilai unik terakhir.

Coba ini:

$arrDuplicate = array ("","",1,3,"",5);

foreach (array_unique($arrDuplicate) as $v){
  if($v != "") { $arrRemoved[] = $v; }
}
print_r ($arrRemoved);
Kering B
sumber
1
    if (@!in_array($classified->category,$arr)){        
                                    $arr[] = $classified->category;
                                 ?>

            <?php } endwhile; wp_reset_query(); ?>

nilai cek pertama kali dalam array dan menemukan nilai yang sama mengabaikannya

Alpesh Navadiya
sumber
1

Hapus nilai duplikat dari array asosiatif di PHP.

$arrDup = Array ('0' => 'aaa-aaa' , 'SKU' => 'aaa-aaa' , '1' => '12/1/1' , 'date' => '12/1/1' , '2' => '1.15' , 'cost' => '1.15' );

foreach($arrDup as $k =>  $v){
  if(!( isset ($hold[$v])))
      $hold[$v]=1;
  else
      unset($arrDup[$k]);
}

Array ([0] => aaa-aaa [1] => 12/1/1 [2] => 1.15)

Shivivanand
sumber
1

Ada beberapa cara untuk melakukan ini, yaitu sebagai berikut

//first method
$filter = array_map("unserialize", array_unique(array_map("serialize", $arr)));

//second method
$array = array_unique($arr, SORT_REGULAR);
Shahrukh Anwar
sumber
1

Jika Anda khawatir dengan kinerja dan memiliki larik sederhana, gunakan:

array_keys(array_flip($array));

Ini jauh lebih cepat daripada array_unique.

michal.jakubeczy
sumber
1
$a = array(1, 2, 3, 4); 
$b = array(1, 6, 5, 2, 9); 
$c = array_merge($a, $b);
$unique = array_keys(array_flip($c));
print_r($unique);
pawan kumar
sumber
Cara tercepat untuk mencapai ini adalah dengan menggunakan fungsi array_flip bawaan untuk PHP [1]. array_flip akan menukar nilai array dengan kunci mereka dan karena array tidak dapat memiliki kunci duplikat Anda akan berakhir dengan seperangkat kunci unik yang sesuai dengan nilai-nilai array asli. Untuk mengambil kunci ini sebagai nilai, Anda dapat menggunakan fungsi array_keys untuk mengambil nilai unik Anda. Baik array_flip dan array_keys adalah fungsi huruf O (n) terburuk, sedangkan array_unique memiliki huruf terburuk O (n log (n)). [2]
pawan kumar
1
Silakan tambahkan beberapa penjelasan lagi untuk jawaban Anda (bukan ke bagian komentar!). Bagaimana kode yang diberikan menghapus nilai duplikat dari satu array? Mengapa Anda perlu dua array untuk itu?
Nico Haase
Selamat datang di StackOverflow! Saya melihat bahwa Anda telah menambahkan beberapa penjelasan dalam komentar jawaban Anda, akan sangat membantu jika Anda menambahkan informasi ini sebagai bagian dari jawaban Anda sendiri.
n4m31ess_c0d3r
Tampaknya lebih masuk akal untuk menambahkan komentar itu sebagai edit untuk jawaban yang sudah lama ada ( stackoverflow.com/a/52591730/2109067 ).
ankhzet
Anda dapat menggunakan array tunggal dengan elemen duplikat. Saya punya masalah mendapatkan nilai dari dua array menjadi satu kemudian menghapus duplikat.
pawan kumar
0
$arrDuplicate = array ("","",1,3,"",5);
 foreach(array_unique($arrDuplicate) as $v){
  if($v != "" ){$arrRemoved = $v;  }}
print_r($arrRemoved);
pengguna1045247
sumber
1
Ini benar-benar tidak menjelaskan apa-apa, dan sepertinya tidak "lebih pintar".
Sven
Anda selalu dapat menjelaskan alasannya dengan mengedit posting Anda sendiri, cukup klik tautan "edit" di akhir jawaban Anda. Saya juga menyarankan agar Anda melihat FAQ: stackoverflow.com/faq
ForceMagic
0
function arrayUnique($myArray)
{
    $newArray = Array();
    if (is_array($myArray))
    {
        foreach($myArray as $key=>$val)
        {
            if (is_array($val))
            {
                $val2 = arrayUnique($val);
            }
            else
            {
                $val2 = $val;
                $newArray=array_unique($myArray);
                $newArray=deleteEmpty($newArray);
                break;
            }
            if (!empty($val2))
            {
                $newArray[$key] = $val2;
            }
        }
    }
    return ($newArray);
}

function deleteEmpty($myArray)
{
    $retArray= Array();
    foreach($myArray as $key=>$val)
    {
        if (($key<>"") && ($val<>""))
        {
            $retArray[$key] = $val;
        }
    }
    return $retArray;
}
Vineesh Kalarickal
sumber
0

coba kode singkat & manis ini -

$array = array (1,4,2,1,7,4,9,7,5,9);
$unique = array();

foreach($array as $v){
  isset($k[$v]) || ($k[$v]=1) && $unique[] = $v;
  }

var_dump($unique);

Keluaran -

array(6) {
  [0]=>
  int(1)
  [1]=>
  int(4)
  [2]=>
  int(2)
  [3]=>
  int(7)
  [4]=>
  int(9)
  [5]=>
  int(5)
}
Rohit Suthar
sumber
1
Menyalahgunakan operator boolean untuk aliran kontrol seperti ini tidak perlu membingungkan. Gunakan saja if.
Mark Amery
0
<?php
$arr1 = [1,1,2,3,4,5,6,3,1,3,5,3,20];    
print_r(arr_unique($arr1));


function arr_unique($arr) {
  sort($arr);
  $curr = $arr[0];
  $uni_arr[] = $arr[0];
  for($i=0; $i<count($arr);$i++){
      if($curr != $arr[$i]) {
        $uni_arr[] = $arr[$i];
        $curr = $arr[$i];
      }
  }
  return $uni_arr;
}
sumityadavbadli
sumber
Menempatkan hitungan ($ arr) dalam loop cukup lambat
Kiruahxh
0

Di sini saya telah membuat array kosong kedua dan menggunakan forloop dengan array pertama yang memiliki duplikat. Ini akan berjalan sebanyak hitungan dari array pertama. Kemudian dibandingkan dengan posisi array dengan array pertama dan cocok bahwa item ini sudah ada atau tidak dengan menggunakan in_array. Jika tidak maka itu akan menambahkan item ke array kedua array_push.

$a = array(1,2,3,1,3,4,5);
$count = count($a);
$b = [];
for($i=0; $i<$count; $i++){
    if(!in_array($a[$i], $b)){
        array_push($b, $a[$i]);
    }
}
print_r ($b);
Aladin Banwal
sumber
Bisakah Anda berbagi penjelasan tentang kode itu? Misalnya, mengapa Anda tidak menggunakan foreachloop?
Nico Haase
Ini semacam bentuk melakukan dan mengapa saya tidak menggunakan foreachkarena saya jauh lebih nyaman dengan untuk loop. Itu dia.
Aladin Banwal
Meskipun demikian, Anda harus membagikan beberapa penjelasan dengan kode tersebut. Posting jawaban seperti itu pada SO bukanlah gaya yang baik: orang-orang dengan masalah yang sama seperti OP dapat datang, dan mereka harus dapat memahami bagaimana kode Anda memecahkan masalah sehingga mereka dapat belajar darinya dan mengadopsinya sesuai kebutuhan mereka
Nico Haase
0

Hal ini dapat dilakukan melalui fungsi I membuat tiga fungsi duplikat mengembalikan nilai-nilai yang duplikat dalam array.

Fungsi kedua pengembalian tunggal hanya nilai-nilai yang berarti tunggal tidak diulang dalam array dan fungsi ketiga dan penuh mengembalikan semua nilai tetapi tidak digandakan jika ada nilai digandakan itu mengubahnya menjadi tunggal;

function duplicate($arr) {
    $duplicate;
    $count = array_count_values($arr);
    foreach($arr as $key => $value) {
        if ($count[$value] > 1) {
            $duplicate[$value] = $value;
        }
    }
    return $duplicate;
}
function single($arr) {
    $single;
    $count = array_count_values($arr);
    foreach($arr as $key => $value) {
        if ($count[$value] == 1) {
            $single[$value] = $value;
        }
    }
    return $single;
}
function full($arr, $arry) {
    $full = $arr + $arry;
    sort($full);
    return $full;
}
Mirza Obaid
sumber
0
$array = array("a" => "moon", "star", "b" => "moon", "star", "sky");

// Deleting the duplicate items
$result = array_unique($array);
print_r($result);

ref: Demo

nageen nayak
sumber
1
Apa gunanya menjawab pertanyaan ini dengan array_unique 11 tahun setelah jawaban asli yang persis seperti ini?
Dylan Kas
0

Alternatif untuk fungsi array_unique () ..

Menggunakan algoritma Brute force

// [1] Ini array kami dengan item yang digandakan

$ cocok = ["jorge", "melvin", "chelsy", "melvin", "jorge", "smith"];

// [2] Wadah untuk array baru tanpa item duplikat

$ arr = [];

// [3] dapatkan panjang dari array yang digandakan dan atur ke var len untuk digunakan untuk for loop

$ len = count ($ cocok);

// [4] Jika cocok dengan kunci array ($ i) perulangan loop saat ini tidak tersedia di // [4] array $ arr lalu dorong nilai kunci iterasi saat ini dari kecocokan [$ i] // [4] ke array array.

untuk ($ i = 0; $ i if(array_search($matches[$i], $arr) === false){ array_push($arr,$matches[$i]); } } //print the array $arr. print_r($arr); //Result: Array ( [0] => jorge [1] => melvin [2] => chelsy [3] => smith )

Richard Ramos
sumber
-2

Saya telah melakukan ini tanpa menggunakan fungsi apa pun.

$arr = array("1", "2", "3", "4", "5", "4", "2", "1");

$len = count($arr);
for ($i = 0; $i < $len; $i++) {
  $temp = $arr[$i];
  $j = $i;
  for ($k = 0; $k < $len; $k++) {
    if ($k != $j) {
      if ($temp == $arr[$k]) {
        echo $temp."<br>";
        $arr[$k]=" ";
      }
    }
  }
}

for ($i = 0; $i < $len; $i++) {
  echo $arr[$i] . " <br><br>";
}
Ashishdmc4
sumber