203

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

4

26 回答 26

325

使用array_unique()

例子:

$array = array(1, 2, 2, 3);
$array = array_unique($array); // Array is now (1, 2, 3)
于 2008-11-21T02:39:33.040 回答
60

采用array_values(array_unique($array));

array_unique: 用于唯一数组 array_values: 用于重新索引

于 2017-02-15T13:49:33.147 回答
31
//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 )
于 2011-12-06T11:23:46.753 回答
16

唯一对我有用的是:

$array = array_unique($array, SORT_REGULAR);

编辑:SORT_REGULAR保持与原始数组相同的顺序。

于 2017-01-12T18:57:41.117 回答
15
$result = array();
foreach ($array as $key => $value){
  if(!in_array($value, $result))
    $result[$key]=$value;
}
于 2018-02-12T21:05:16.120 回答
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 */
于 2011-05-13T22:57:48.290 回答
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);
于 2017-06-29T08:55:58.013 回答
3
$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);
于 2019-04-10T12:38:40.680 回答
2

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

这将处理键关联并序列化生成的新数组的键:-)

于 2010-08-18T12:41:25.453 回答
2

根据数组的大小,我发现

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

可以比 array_unique 更快。

于 2016-07-25T01:57:36.860 回答
2

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

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

//second method
$array = array_unique($arr, SORT_REGULAR);
于 2018-06-05T08:33:32.307 回答
2

我们可以很容易地使用arrar_unique($array);删除重复元素 ,但是这种方法的问题是元素的索引不按顺序,如果以后在其他地方使用会导致问题。

采用

$arr = array_unique($arr);
$arr = array_values($arr);
print_r($arr);

或者

$arr = array_flip($arr);
$arr = array_flip($arr);
$arr = array_values($arr);
print_r($arr);

第一次翻转,翻转键值对,从而将元素与相似的键(最初是值)组合起来。

第二次翻转以还原所有键值对。最后array_value()用从 0 开始的键设置每个值。

注意:不可用于具有预定义键值对的关联数组

于 2021-07-07T20:53:17.943 回答
1

这是一个很好的方法。可能想确保它的输出再次返回一个数组。现在您只显示最后一个唯一值。

试试这个:

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

foreach (array_unique($arrDuplicate) as $v){
  if($v != "") { $arrRemoved[] = $v; }
}
print_r ($arrRemoved);
于 2012-08-09T09:53:20.767 回答
1
    if (@!in_array($classified->category,$arr)){        
                                    $arr[] = $classified->category;
                                 ?>

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

第一次检查数组中的值并发现相同的值忽略它

于 2017-06-15T05:42:08.237 回答
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)

于 2018-02-12T20:39:32.333 回答
1

如果您关心性能并且有简单的数组,请使用:

array_keys(array_flip($array));

它比array_unique 快很多倍。

于 2018-10-01T12:59:42.223 回答
0
$arrDuplicate = array ("","",1,3,"",5);
 foreach(array_unique($arrDuplicate) as $v){
  if($v != "" ){$arrRemoved = $v;  }}
print_r($arrRemoved);
于 2011-11-14T09:09:27.740 回答
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)
}
于 2014-04-01T09:47:00.943 回答
0

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

第二个函数single只返回那些在数组中不重复的单一的值,第三个和完整的函数返回所有值但不重复,如果任何值重复,则将其转换为single;

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;
}
于 2015-07-27T06:45:09.927 回答
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;
}
于 2017-01-24T08:35:07.053 回答
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);
于 2018-12-04T07:31:21.980 回答
0

array_unique() 函数的替代方法..

使用蛮力算法

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

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

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

$arr = [];

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

$len = count($matches);

//[4] 如果匹配数组 key($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 )

于 2020-03-14T19:05:11.850 回答
-1
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;
}
于 2012-11-05T11:11:13.880 回答
-1
<?php
$a=array("1"=>"302","2"=>"302","3"=>"276","4"=>"301","5"=>"302");
print_r(array_values(array_unique($a)));
?>//`output -> Array ( [0] => 302 [1] => 276 [2] => 301 )`
于 2021-01-01T06:01:33.527 回答
-2
$array = array("a" => "moon", "star", "b" => "moon", "star", "sky");

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

参考:演示

于 2019-07-05T13:23:18.900 回答
-3

我没有使用任何功能就做到了。

$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>";
}
于 2010-03-07T17:31:45.737 回答