【发布时间】:2010-09-23 09:17:03
【问题描述】:
如何在 PHP 中删除数组中的重复值?
【问题讨论】:
标签: php arrays duplicate-data
如何在 PHP 中删除数组中的重复值?
【问题讨论】:
标签: php arrays duplicate-data
例子:
$array = array(1, 2, 2, 3);
$array = array_unique($array); // Array is now (1, 2, 3)
【讨论】:
Note that array_unique() is not intended to work on multi dimensional arrays.
$array = array_unique($array, SORT_REGULAR);
使用array_values(array_unique($array));
array_unique: 用于唯一数组
array_values: 用于重新索引
【讨论】:
array_unique 返回一个包含键值对的对象,并且array_values 仅将值作为数组返回。
//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 )
【讨论】:
唯一对我有用的是:
$array = array_unique($array, SORT_REGULAR);
编辑:SORT_REGULAR 保持与原始数组相同的顺序。
【讨论】:
$result = array();
foreach ($array as $key => $value){
if(!in_array($value, $result))
$result[$key]=$value;
}
【讨论】:
有时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 */
【讨论】:
我们可以创建这种类型的数组来使用最后一个值将被更新为列或键值,我们将从数组中获取唯一值...
$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);
【讨论】:
$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);
【讨论】:
explode(",", implode(",", array_unique(explode(",", $YOUR_ARRAY))));
这将处理键关联并序列化生成的新数组的键:-)
【讨论】:
$YOUR_ARRAY 是array("1", "2", "3") 时,explode("," $YOUR_ARRAY) 会产生什么影响?
根据你的数组大小,我找到了
$array = array_values( array_flip( array_flip( $array ) ) );
可以比 array_unique 更快。
【讨论】:
有多种方法可以做到这些,如下所示
//first method
$filter = array_map("unserialize", array_unique(array_map("serialize", $arr)));
//second method
$array = array_unique($arr, SORT_REGULAR);
【讨论】:
我们可以轻松使用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开始的key。
注意:不可用于预定义键值对的关联数组中
【讨论】:
这是一个很好的方法。可能想确保它的输出再次返回一个数组。现在您只显示最后一个唯一值。
试试这个:
$arrDuplicate = array ("","",1,3,"",5);
foreach (array_unique($arrDuplicate) as $v){
if($v != "") { $arrRemoved[] = $v; }
}
print_r ($arrRemoved);
【讨论】:
if (@!in_array($classified->category,$arr)){
$arr[] = $classified->category;
?>
<?php } endwhile; wp_reset_query(); ?>
第一次检查数组中的值,发现相同的值忽略它
【讨论】:
从 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)
【讨论】:
如果您关心性能并且有简单的数组,请使用:
array_keys(array_flip($array));
它比 array_unique 快很多倍。
【讨论】:
$arrDuplicate = array ("","",1,3,"",5);
foreach(array_unique($arrDuplicate) as $v){
if($v != "" ){$arrRemoved = $v; }}
print_r($arrRemoved);
【讨论】:
试试这个简短而甜蜜的代码 -
$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)
}
【讨论】:
if。
<?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;
}
【讨论】:
在这里,我创建了第二个空数组并将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 循环?
foreach 的原因,因为我对 for 循环非常熟悉。就是这样。
可以通过函数来完成,我做了三个函数重复返回数组中重复的值。
第二个函数只返回那些单一的值,意味着不在数组中重复,第三个和完整的函数返回所有值但不重复,如果任何值重复,则将其转换为单个值;
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;
}
【讨论】:
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。
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
)
【讨论】:
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;
}
【讨论】:
<?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 )`
【讨论】:
$array = array("a" => "moon", "star", "b" => "moon", "star", "sky");
// Deleting the duplicate items
$result = array_unique($array);
print_r($result);
参考:Demo
【讨论】:
我在没有使用任何功能的情况下完成了这项工作。
$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>";
}
【讨论】: