Cách xóa các giá trị trùng lặp khỏi một mảng trong PHP


155

Làm cách nào để xóa các giá trị trùng lặp khỏi một mảng trong PHP?

Câu trả lời:


251

Sử dụng mảng_unique () .

Thí dụ:

$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
Ở trên sẽ bảo tồn các khóa của phần tử. Nếu bạn muốn họ tái lập chỉ mục, ngoài áp dụng array_values: php.net/manual/en/function.array-values.php
CodeVirtuoso

3
Điều này không làm việc cho tôi vui lòng sử dụng: $array = array_unique($array, SORT_REGULAR);
iniravpatel

@PeterAjtai: Cảm ơn bạn đã nhấn mạnh trong phần bình luận. Nó tiết kiệm rất nhiều thời gian cho tôi.
Nana Partykar

29

Sử dụng array_values(array_unique($array));

array_unique: cho mảng duy nhất array_values: cho reindexing


1
+1 array_uniquetrả về một đối tượng có cặp khóa và giá trị VÀ array_valueschỉ trả về các giá trị dưới dạng một mảng.
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

Điều duy nhất làm việc cho tôi là:

$array = array_unique($array, SORT_REGULAR);

Chỉnh sửa: SORT_REGULARgiữ nguyên thứ tự của mảng ban đầu.


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

5

đôi khi array_unique()không phải là cách, nếu bạn muốn nhận các mục độc đáo VÀ trùng lặp ...

$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

kết quả trên

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

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

3

Chúng tôi có thể tạo loại mảng như vậy để sử dụng giá trị cuối cùng này sẽ được cập nhật thành giá trị cột hoặc khóa và chúng tôi sẽ nhận được giá trị duy nhất từ ​​mảng ...

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

Điều này sẽ chăm sóc các hiệp hội quan trọng và tuần tự hóa các khóa cho mảng mới kết quả :-)


1
Điều gì sẽ là ảnh hưởng của explode("," $YOUR_ARRAY)khi $YOUR_ARRAYarray("1", "2", "3")?
kiamlaluno

@kiamlaluno - :) và câu trả lời là: Cảnh báo: explode () dự kiến ​​tham số 2 sẽ là chuỗi, mảng được đưa ra trong ... trên dòng ....
Jesse Chisholm

@JesseChisholm Vâng, đây là điểm, nhưng rõ ràng không ai chú ý đến mã.
kiamlaluno

2

Tùy thuộc vào kích thước của mảng của bạn, tôi đã tìm thấy

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

có thể nhanh hơn mảng_unique.


Bất kỳ thông tin nào về những gì đang diễn ra ở đây và nó sẽ nhanh hơn với một mảng lớn hơn hoặc nhỏ hơn.
Fi Horan

Việc lật đôi sẽ loại bỏ các giá trị trùng lặp, bởi vì một khóa không thể tồn tại hai lần, nếu không nó sẽ bị ghi đè. Nếu bất kỳ giá trị nào được nhân đôi và mảng được lật, lần xuất hiện cuối cùng (tôi giả sử) sẽ là giá trị cho khóa.
Goldentoa11

Trong PHP 7 tôi đã nhận thấy việc lật một mảng nhiều chiều nhiều lần có thể sắp xếp lại các phần tử mảng một cách bất ngờ.
Josh Habdas

1

Đó là một cách tuyệt vời để làm điều đó. Có thể muốn đảm bảo đầu ra của nó trở lại một mảng một lần nữa. Bây giờ bạn chỉ hiển thị giá trị duy nhất cuối cùng.

Thử cái này:

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

lần đầu tiên kiểm tra giá trị trong mảng và tìm thấy cùng một giá trị bỏ qua nó


1

Xóa các giá trị trùng lặp khỏi một mảng kết hợp trong 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]);
}

Mảng ([0] => aaa-aaa [1] => 12/1/1 [2] => 1.15)


1

Có thể có nhiều cách để làm những việc này, như sau

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

//second method
$array = array_unique($arr, SORT_REGULAR);

1

Nếu bạn quan tâm đến hiệu suất và có mảng đơn giản, hãy sử dụng:

array_keys(array_flip($array));

Nó nhanh hơn nhiều lần so với mảng_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);

Cách nhanh nhất để đạt được điều này là sử dụng hàm Array_flip tích hợp sẵn trong PHP [1]. mảng_flip sẽ trao đổi các giá trị mảng bằng các khóa của chúng và vì một mảng không thể có các khóa trùng lặp, bạn sẽ kết thúc với một bộ khóa duy nhất tương ứng với các giá trị của mảng ban đầu. Để truy xuất các khóa này dưới dạng giá trị, bạn có thể sử dụng hàm Array_keys để truy xuất các giá trị duy nhất của mình. Cả Array_flip và Array_keys đều là các hàm O (n) trong trường hợp xấu nhất trong khi Array_unique có trường hợp xấu nhất là O (n log (n)). [2]
pawan kumar

1
Vui lòng thêm một số giải thích cho câu trả lời của bạn (không phải vào phần bình luận!). Làm thế nào để mã đã cho loại bỏ các giá trị trùng lặp từ một mảng duy nhất ? Tại sao bạn cần hai mảng cho điều đó?
Nico Haase

Chào mừng bạn đến với StackOverflow! Tôi thấy rằng bạn đã thêm một số lời giải thích trong các bình luận về câu trả lời của bạn, sẽ rất hữu ích nếu bạn thêm thông tin này như một phần của câu trả lời của chính bạn.
n4m31ess_c0d3r

Có vẻ hợp lý hơn khi thêm nhận xét đó dưới dạng chỉnh sửa vào câu trả lời đã có từ lâu ( stackoverflow.com/a/52591730/2109067 ).
ankhzet

Bạn có thể sử dụng mảng đơn với các yếu tố trùng lặp. Tôi gặp vấn đề về việc lấy các giá trị từ hai mảng thành một rồi loại bỏ các bản sao.
pawan kumar

0
$arrDuplicate = array ("","",1,3,"",5);
 foreach(array_unique($arrDuplicate) as $v){
  if($v != "" ){$arrRemoved = $v;  }}
print_r($arrRemoved);

1
Điều này thực sự không giải thích bất cứ điều gì, và nó dường như không "thông minh hơn".
Sven

Bạn luôn có thể giải thích lý do tại sao bằng cách chỉnh sửa bài đăng của riêng bạn, chỉ cần nhấp vào liên kết "chỉnh sửa" ở cuối câu trả lời của bạn. Tôi cũng đề nghị bạn nên xem Câu hỏi thường gặp: 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

thử mã ngắn và ngọt ngào này -

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

Đầu ra -

array(6) {
  [0]=>
  int(1)
  [1]=>
  int(4)
  [2]=>
  int(2)
  [3]=>
  int(7)
  [4]=>
  int(9)
  [5]=>
  int(5)
}

1
Việc lạm dụng các toán tử boolean cho luồng điều khiển như thế này là không cần thiết. Chỉ cần sử dụng if.
Đánh dấu 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;
}

Việc đếm số ($ Array) trong vòng lặp khá chậm
Kiruahxh

0

Ở đây tôi đã tạo ra một mảng trống thứ hai và forvòng lặp được sử dụng với mảng đầu tiên có các bản sao. Nó sẽ chạy nhiều lần như đếm số của mảng đầu tiên. Sau đó so sánh với vị trí của mảng với mảng đầu tiên và khớp với nó có mục này hay không bằng cách sử dụng in_array. Nếu không thì nó sẽ thêm mục đó vào mảng thứ hai 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);

Bạn có thể chia sẻ một số lời giải thích về mã đó? Ví dụ, tại sao bạn không sử dụng foreachvòng lặp?
Nico Haase

Đây là một hình thức làm việc và tại sao tôi không sử dụng foreachvì tôi rất thoải mái với vòng lặp. Đó là nó.
Aladin Banwal

Tuy nhiên, bạn nên chia sẻ một số giải thích với mã. Đăng câu trả lời như vậy lên SO không phải là một phong cách hay: những người có cùng vấn đề với OP có thể gặp phải và họ có thể hiểu cách mã của bạn giải quyết vấn đề sao cho họ có thể học hỏi từ đó và áp dụng nó vào nhu cầu của họ
Nico Haase

0

Nó có thể được thực hiện thông qua chức năng Tôi tạo ba chức năng trùng lặp trả về các giá trị được nhân đôi trong mảng.

Hàm thứ hai chỉ trả về các giá trị có nghĩa là đơn không được lặp lại trong mảng và hàm thứ ba và hàm đầy đủ trả về tất cả các giá trị nhưng không bị trùng lặp nếu có bất kỳ giá trị nào được nhân đôi, nó chuyển đổi thành đơn;

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: Bản trình diễn


1
Điểm trả lời câu hỏi này với mảng_unique 11 năm sau câu trả lời ban đầu chính xác là gì?
Dylan Kas

0

Một thay thế cho hàm Array_unique () ..

Sử dụng thuật toán lực Brute

// [1] Đây là mảng của chúng tôi với các mục trùng lặp

$ trận đấu = ["jorge", "melvin", "chelsy", "melvin", "jorge", "smith"];

// [2] Container cho mảng mới mà không có bất kỳ mục trùng lặp nào

$ mảng = [];

// [3] lấy chiều dài của mảng trùng lặp và đặt nó vào var len để sử dụng cho vòng lặp

$ len = đếm ($ khớp);

// [4] Nếu khớp với khóa mảng ($ i) Lặp lại vòng lặp hiện tại không có sẵn trong // [4] mảng $ Array sau đó đẩy giá trị khóa lặp hiện tại của các kết quả khớp [$ i] // [4] vào mảng mảng.

cho ($ 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

Tôi đã làm điều này mà không sử dụng bất kỳ chức năng.

$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>";
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.