Cara menghapus nilai duplikat dari array di PHP


Jawaban:


251

Gunakan array_unique () .

Contoh:

$array = array(1, 2, 2, 3);
$array = array_unique($array); // Array is now (1, 2, 3)

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


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 )

9

Satu-satunya hal yang berhasil bagi saya adalah:

$array = array_unique($array, SORT_REGULAR);

Sunting: SORT_REGULARmenjaga urutan yang sama dari array asli.


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

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 */

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

2

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

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


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.


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

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


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)


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

1

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

array_keys(array_flip($array));

Ini jauh lebih cepat daripada array_unique.


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

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

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

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

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

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

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

0
$array = array("a" => "moon", "star", "b" => "moon", "star", "sky");

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

ref: Demo


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 )


-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>";
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.