วิธีการลบค่าที่ซ้ำกันออกจากอาร์เรย์ใน PHP


คำตอบ:


251

ใช้array_unique ()

ตัวอย่าง:

$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
ด้านบนจะรักษากุญแจขององค์ประกอบต่างๆ หากคุณต้องการจัดทำดัชนีอีกครั้งนอกจากนี้ให้ใช้ array_values: php.net/manual/en/function.array-values.php
CodeVirtuoso

3
สิ่งนี้ใช้ไม่ได้สำหรับฉันโปรดใช้: $array = array_unique($array, SORT_REGULAR);
iniravpatel

@PeterAjtai: ขอบคุณที่เน้นในส่วนความคิดเห็น มันประหยัดเวลาได้มากสำหรับฉัน
Nana Partykar

29

ใช้ array_values(array_unique($array));

array_unique: สำหรับอาร์เรย์ที่ไม่ซ้ำกัน array_values: สำหรับการทำดัชนีใหม่


1
+1 array_uniqueส่งคืนออบเจ็กต์ที่มีคู่ของคีย์และค่าและarray_valuesส่งคืนเฉพาะค่าเป็นอาร์เรย์
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

สิ่งเดียวที่ใช้ได้ผลสำหรับฉันคือ:

$array = array_unique($array, SORT_REGULAR);

แก้ไข: SORT_REGULARคงลำดับเดิมของอาร์เรย์เดิม



5

บางครั้งarray_unique()ไม่ใช่วิธีถ้าคุณต้องการได้รับรายการที่ซ้ำกันและซ้ำ ...

$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

ผลลัพธ์ใน

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

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

3

เราสามารถสร้างอาเรย์ประเภทนี้เพื่อใช้ค่าสุดท้ายนี้จะถูกอัพเดตเป็นคอลัมน์หรือค่าคีย์และเราจะได้รับค่าที่ไม่ซ้ำจากอาเรย์ ...

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

สิ่งนี้จะดูแลการเชื่อมโยงหลักและเรียงลำดับคีย์สำหรับอาร์เรย์ใหม่ที่เป็นผลลัพธ์ :-)


1
สิ่งที่จะเป็นผลกระทบจากexplode("," $YOUR_ARRAY)เมื่อ$YOUR_ARRAYเป็นarray("1", "2", "3")?
kiamlaluno

@kiamlaluno - :) และคำตอบคือ: คำเตือน: explode () คาดว่าพารามิเตอร์ 2 จะเป็นสตริงอาร์เรย์ที่กำหนดใน ... ในบรรทัด ....
Jesse Chisholm

@JesseChisholm ใช่นี่คือจุด แต่ไม่มีใครสังเกตเห็นรหัสชัดเจน
kiamlaluno

2

ฉันได้พบแล้วขึ้นอยู่กับขนาดของอาเรย์ของคุณ

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

สามารถเร็วกว่า array_unique


ข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่เกิดขึ้นที่นี่และมันจะเร็วขึ้นด้วยอาร์เรย์ที่ใหญ่กว่าหรือเล็กกว่า
Fi Horan

การพลิกสองครั้งจะเป็นการลบค่าที่ซ้ำกันเนื่องจากคีย์ไม่สามารถมีอยู่สองครั้งมิฉะนั้นจะถูกเขียนทับ หากมีการทำซ้ำค่าใด ๆ และอาร์เรย์ถูกพลิกการเกิดขึ้นครั้งสุดท้าย (ฉันถือว่า) จะเป็นค่าสำหรับคีย์
Goldentoa11

ใน PHP 7 ฉันสังเกตว่าการพลิกอาร์เรย์หลายมิติมากกว่าหนึ่งครั้งอาจเรียงลำดับองค์ประกอบของอาร์เรย์โดยไม่คาดคิด
Josh Habdas

1

นั่นเป็นวิธีที่ยอดเยี่ยมที่จะทำ อาจต้องการตรวจสอบให้แน่ใจว่าผลลัพธ์ที่ได้จะกลับอาร์เรย์อีกครั้ง ตอนนี้คุณจะแสดงเฉพาะค่าสุดท้ายเท่านั้น

ลองสิ่งนี้:

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

ค่าการตรวจสอบครั้งแรกในอาร์เรย์และพบว่าค่าเดียวกันไม่สนใจมัน


1

ลบค่าที่ซ้ำกันออกจากอาเรย์แบบเชื่อมโยงใน 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

หากคุณกังวลเรื่องประสิทธิภาพและมีอาเรย์อย่างง่ายให้ใช้:

array_keys(array_flip($array));

มันเร็วกว่า 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);

วิธีที่เร็วที่สุดในการบรรลุเป้าหมายนี้คือการใช้ฟังก์ชั่น array_flip ในตัวเป็น PHP [1] array_flip จะสลับค่าอาร์เรย์ด้วยกุญแจและเนื่องจากอาร์เรย์ไม่สามารถมีคีย์ซ้ำได้คุณจะได้ชุดคีย์ที่ไม่ซ้ำกันซึ่งสอดคล้องกับค่าของอาร์เรย์เดิม ในการดึงข้อมูลคีย์เหล่านี้เป็นค่าคุณสามารถใช้ฟังก์ชัน array_keys เพื่อดึงค่าที่ไม่ซ้ำกันของคุณ ทั้ง array_flip และ array_keys เป็นฟังก์ชัน O (n) กรณีที่แย่ที่สุดในขณะที่ array_unique มีกรณีที่แย่ที่สุดของ O (n log (n)) [2]
pawan kumar

1
โปรดเพิ่มคำอธิบายเพิ่มเติมในคำตอบของคุณ (ไม่ใช่ในส่วนความคิดเห็น!) รหัสที่กำหนดให้ลบค่าที่ซ้ำกันออกจากอาร์เรย์เดียวได้อย่างไร ทำไมคุณต้องมีสองอาร์เรย์สำหรับสิ่งนั้น
Nico Haase

ยินดีต้อนรับสู่ StackOverflow! ฉันเห็นว่าคุณได้เพิ่มคำอธิบายลงในความคิดเห็นของคำตอบของคุณแล้วมันจะมีประโยชน์ถ้าคุณเพิ่มข้อมูลนี้เป็นส่วนหนึ่งของคำตอบของคุณเอง
n4m31ess_c0d3r

ดูเหมือนว่ามีเหตุผลมากขึ้นในการเพิ่มความคิดเห็นนั้นเป็นการแก้ไขคำตอบที่มีอยู่มานานแล้ว ( stackoverflow.com/a/52591730/2109067 )
ankhzet

คุณสามารถใช้อาร์เรย์เดียวกับองค์ประกอบที่ซ้ำกัน ฉันมีปัญหาในการรับค่าจากสองอาร์เรย์เป็นหนึ่งแล้วลบรายการที่ซ้ำกัน
pawan kumar

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

1
สิ่งนี้ไม่ได้อธิบายอะไรเลยและดูเหมือนจะไม่ "ฉลาด"
สเวน

คุณสามารถอธิบายได้ว่าทำไมโดยแก้ไขโพสต์ของคุณเองเพียงคลิกที่ลิงก์ "แก้ไข" ที่ท้ายคำตอบของคุณ ฉันขอแนะนำให้คุณดูคำถามที่พบบ่อย: 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

ลองใช้โค้ดย่อและหวานนี้ -

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

ผลผลิต -

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

1
การใช้โอเปอเรเตอร์บูลีนที่ผิดสำหรับการควบคุมโฟลว์เช่นนี้ทำให้เกิดความสับสนโดยไม่จำเป็น 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;
}

การนับจำนวน ($ arr) ในลูปค่อนข้างช้า
Kiruahxh

0

ที่นี่ฉันได้สร้างอาร์เรย์ว่างที่สองและใช้forลูปกับอาร์เรย์แรกที่มีการทำซ้ำ มันจะทำงานได้หลายครั้งตามการนับของอาร์เรย์แรก in_arrayจากนั้นเมื่อเทียบกับตำแหน่งของอาร์เรย์กับอาร์เรย์แรกและจับคู่ว่ามีรายการนี้อยู่แล้วหรือไม่โดยใช้ 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);

คุณสามารถแบ่งปันคำอธิบายเกี่ยวกับรหัสนั้นได้ไหม ตัวอย่างเช่นทำไมคุณไม่ใช้การforeachวนซ้ำ
Nico Haase

นี่เป็นรูปแบบของการทำและทำไมฉันไม่ใช้foreachเพราะฉันสบายมากสำหรับวง แค่นั้นแหละ.
Aladin Banwal

อย่างไรก็ตามคุณควรแบ่งปันคำอธิบายบางอย่างกับรหัส โพสต์คำตอบดังกล่าวใน SO ไม่ได้เป็นรูปแบบที่ดี: คนที่มีปัญหาเช่นเดียวกับ OP จะมาพร้อมและพวกเขาควรจะสามารถที่จะเข้าใจว่ารหัสของคุณจะช่วยแก้ปัญหาดังกล่าวว่าพวกเขาสามารถเรียนรู้จากมันและนำมาใช้ตามความต้องการของพวกเขา
Nico Haase

0

มันสามารถทำได้ผ่านฟังก์ชั่นฉันทำสามฟังก์ชั่นที่ซ้ำกันคืนค่าที่ซ้ำกันในอาร์เรย์

ฟังก์ชั่นที่สองเดียวคืนค่าเฉพาะที่เป็นค่าเฉลี่ยเดียวไม่ซ้ำในอาร์เรย์และฟังก์ชั่นที่สามและเต็มกลับค่าทั้งหมด แต่ไม่ได้ทำซ้ำถ้ามีค่าใด ๆ ที่ซ้ำกันมันจะแปลงเป็นเดี่ยว;

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

อ้างอิง: การสาธิต


1
อะไรคือจุดประสงค์ของการตอบคำถามนี้ด้วย array_unique 11 ปีหลังจากคำตอบเดิมซึ่งตรงนี้
Dylan Kas

0

ทางเลือกสำหรับ array_unique () ฟังก์ชั่น ..

การใช้อัลกอริทึมแรงเดรัจฉาน

// [1] อาร์เรย์ของเรามีรายการที่ซ้ำกัน

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

// [2] คอนเทนเนอร์สำหรับอาร์เรย์ใหม่โดยไม่มีรายการที่ซ้ำกัน

$ arr = [];

// [3] รับความยาวของอาร์เรย์ที่ทำซ้ำและตั้งค่าเป็น var len เพื่อใช้สำหรับลูป

$ len = นับ ($ ตรงกัน);

// [4] หากตรงกับคีย์อาร์เรย์ ($ i) การวนซ้ำปัจจุบันไม่สามารถใช้ได้ // [4] อาร์เรย์ $ arr จากนั้นกดค่าคีย์การวนซ้ำปัจจุบันของการจับคู่ [$ i] // [4] ไปยังอาร์เรย์ arr

สำหรับ ($ 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

ฉันทำสิ่งนี้โดยไม่ใช้ฟังก์ชั่นใด ๆ

$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>";
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.