如何从PHP中的数组中删除重复的值


Answers:


250

使用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.
彼得Ajtai

18
上面将保留元素的键。如果您希望它们重新索引,请另外应用array_values:php.net/manual/en/function.array-values.php
CodeVirtuoso 2012年

3
$array = array_unique($array, SORT_REGULAR);
不适

@PeterAjtai:谢谢您在评论部分突出显示。它为我节省了很多时间。
娜娜·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保持原始数组的顺序。


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

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)when $YOUR_ARRAYis 的作用是array("1", "2", "3")什么?
kiamlaluno

@kiamlaluno-:),答案是:警告:explode()期望参数2为字符串,在...行上给出的数组....
Jesse Chisholm 2015年

@JesseChisholm是的,这很重要,但是显然没有人注意到该代码。
kiamlaluno 2015年

2

根据您阵列的大小,我发现

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

可以比array_unique更快。


有关此处发生的情况的任何更多信息,使用更大或更小的阵列是否会更快。
霍兰

两次翻转将删除重复的值,因为键不能两次存在,否则它将被覆盖。如果有任何值重复且数组被翻转,则最后一次出现(我假设)将是键的值。
Goldentoa11

在PHP 7中,我注意到多次翻转多维数组可能会意外地对数组元素进行重新排序。
Josh Habdas '17

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

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


1

可以有多种方法来执行这些操作,如下所示

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

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

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

实现此目的的最快方法是使用PHP [1]内置的array_flip函数。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 19-4-10

将该评论添加为已经存在的答案的编辑似乎更合理(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
这实际上并不能解释任何内容,而且似乎也不是“更智能”。
Sven 2012年

您随时可以通过编辑自己的帖子来解释原因,只需单击答案末尾的“编辑”链接即可。我也建议您看一下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

试试这个简短的代码-

$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 2015年

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

将count($ 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因为我对for循环很熟悉而使用它的原因。而已。
阿拉丁·班瓦尔

但是,您应该与代码共享一些解释。在SO上张贴这样的答案不是一个好方法:与OP可能存在相同问题的人们可能会来,他们应该能够理解您的代码如何解决问题,以便他们可以从中学习并采纳他们的需求
Nico Haase

0

这可以通过函数来​​完成,我使三个函数重复返回数组中重复的值。

第二个函数single仅返回那些单值表示在数组中不重复的值,而第三个和full函数则返回所有值,但如果有任何值重复则不重复,它将转换为单值;

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
原来的答案是11年之后,用array_unique回答这个问题有什么意义?
迪伦·卡斯

0

array_unique()函数的替代方法。

使用蛮力算法

// [1]这是包含重复项的数组

$ matches = [“” jorge“,” melvin“,” chelsy“,” melvin“,” jorge“,” smith“];

// [2]新数组的容器,没有任何重复的项目

$ arr = [];

// [3]获取重复数组的长度,并将其设置为var len以用于for循环

$ len = count($ matches);

// [4]如果匹配数组键($ i),则当前循环在以下版本中不可用 // [4]数组$ arr然后推送匹配项的当前迭代键值[$ i] // [4]到数组arr。

for($ 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>";
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.