php合并数组去重
❶ 数组去重的5种方法
数组去重的5种方法:
方法一:
双重for循环去重
原理 两两比较如果相等的话就删除第二个
例如: 1 1 1 3 2 1 2 4
先让第一个1 即arr[0]与后面的一个个比较 如果后面的值等于arr[0] 删除后面的值
第一次结束后的结果是 1 3 2 2 4 删除了后面所有的1
同理 第二次 第三会删除与自己相同的元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function noRepeat1(arr){
// 第一层for用来控制循环的次数
for(var i=0; i<arr.length; i++){
//第二层for 用于控制与第一层比较的元素
for(var j=i+1; j<arr.length; j++){
//如果相等
if(arr[i] == arr[j]){
//删除后面的 即第 j个位置上的元素 删除个数 1 个
arr.splice(j,1);
// j--很关键的一步 如果删除 程序就会出错
//j--的原因是 每次使用splice删除元素时 返回的是一个新的数组
// 这意味这数组下次遍历是 比较市跳过了一个元素
/*
例如: 第一次删除后 返回的是 1 1 3 2 1 2 4
* 但是第二次遍历是 j的值为2 arr[2] = 3
* 相当于跳过一个元素 因此要 j--
* */
j--;
}
}
}
return arr;
}
方法二:
单层for循环
原理和方法一相似
1
2
3
4
5
6
7
8
9
10
11
12
13
function norepeat(arr){
arr.sort();
//先排序让大概相同的在一个位置,这里为什么说是大概相同 是因为sort排序是把元素当字符串排序的 它和可能排成 1 1 10 11 2 20 3 ... 不是我们想要的从小到大
for(var i = 0; i < arr.length-1;i++){
//还是两两比较 一样删除后面的
if(arr[i]==arr[i+1]){
arr.splice(i,1);
//i-- 和j--同理
i--;
}
}
return arr;
}
方法三:
原理:用一个空数组去存首次出现的元素
利用 indexOf 属性 indexOf是返回某个指定的字符在字符串中出现的位置,如果没有就会返回-1
因此我们可以很好的利用这个属性 当返回的是 -1时 就让其存入数组
1
2
3
4
5
6
7
8
9
function noRepeat2(arr){
var newArr = [];
for(var i = 0; i < arr.length; i++){
if(newArr.indexOf(arr[i]) == -1){
newArr.push(arr[i]);
}
}
return newArr;
}
方法四:
原理:利用对象的思想,如果对象里没有这个属性的话就会返回undefined
利用这个原理当返回的是undefined时让其放入数组然后在给这个属性赋值
1
2
3
4
5
6
7
8
9
10
11
function norepeat3(arr) {
var obj = {};
var newArr = [];
for(var i = 0; i < arr.length; i++) {
if(obj[arr[i]] == undefined) {
newArr.push(arr[i]);
obj[arr[i]] = 1;
}
}
return newArr;
}
方法五:
原理:循环比较如果相等的让后面的元素值为0,最后在输出的时候删除为0的这个前提是你的数据里不能有0,但是凡事可以变通你可以设置任何值替代这个0,这个方法是我当时想到实现的所以没有进行很好的优化。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var newArr = [];
//控制外循环
for(var i=0; i<arr.length-1;i++){
//内存循环 只比较后面的
for(j=i+1;j<arr.length;j++){
//如果相等就让其值等于0
if(arr[i]==arr[j]){
arr[j]=0;
}
}
//去除值为0的
if(arr[i]==0){
continue;
}else{
//放入新的数组
newArr.push(arr[i]);
}
}
推荐教程:《php视频教程》
以上就是数组去重的5种方法有哪些?的详细内容,更多请关注php中文网其它相关文章!
❷ php数组去除重复的值
之前写了一篇关于数组去重的文章,但是仅限于一维数组。下面的函数可以用于二维数组:
//二维数组去掉重复值
function array_unique_fb($array2D){foreach ($array2D as $v){$v = join(",",$v); //降维,也可以用implode,将一维数组转换为用逗号连接的字符串
$temp[] = $v;}
$temp = array_unique($temp); //去掉重复的字符串,也就是重复的一维数组
foreach ($temp as $k => $v){$temp[$k] = explode(",",$v); //再将拆开的数组重新组装}return $temp;}
如果你想保留数组的键值,可以用下面的函数:
//二维数组去掉重复值 并保留键值
function array_unique_fb($array2D){foreach ($array2D as $k=>$v){$v = join(",",$v); //降维,也可以用implode,将一维数组转换为用逗号连接的字符串
$temp[$k] = $v;}$temp = array_unique($temp); //去掉重复的字符串,也就是重复的一维数组
foreach ($temp as $k => $v){$array=explode(",",$v); //再将拆开的数组重新组装
$temp2[$k]["id"] =$array[0];
$temp2[$k]["litpic"] =$array[1];
$temp2[$k]["title"] =$array[2];
$temp2[$k]["address"] =$array[3];
$temp2[$k]["starttime"] =$array[4];
$temp2[$k]["endtime"] =$array[5];
$temp2[$k]["classid"] =$array[6];
大概就这样啦。
以上回答你满意么?
❸ PHP合并数组几种方式总结
PHP 中的 array_merge()、array_merge_recursive()函数可以实现
array_merge() 函数把两个或多个数组合并为一个数组。
如果键名有重复,该键的键值为最后一个键名对应的值(后面的覆盖前面的)。如果数组是数字索引的,则键名会以连续方式重新索引。
注意:如果仅仅向 array_merge() 函数输入了一个数组,且键名是整数,则该函数将返回带有整数键名的新数组,其键名以 0 开始进行重新索引。
array_merge(array1,array2,array3...)
参数说明
array1 必需。输入的第一个数组。
array2 必需。输入的第二个数组。
array3 可选。可指定的多个输入数组。
例如:
<?php
$a1=array("a"=>"Horse","b"=>"Dog");
$a2=array("c"=>"Cow","b"=>"Cat");
print_r(array_merge($a1,$a2));
?>
输出:
Array ( [a] => Horse [b] => Cat [c] => Cow )
仅使用一个数组参数:
<?php
$a=array(3=>"Horse",4=>"Dog");
print_r(array_merge($a));
?>
输出:
Array ( [0] => Horse [1] => Dog )
array_merge_recursive() 函数与array_merge()函数不同的是,当有重复的键名时,值不会被覆盖,而是将多个相同键名的值递归组成一个数组。
例如:
<?php
$a1=array("a"=>"Horse","b"=>"Dog");
$a2=array("c"=>"Cow","b"=>"Cat");
print_r(array_merge_recursive($a1,$a2));
?>
输出:
Array (
[a] => Horse
[b] => Array ( [0] => Dog [1] => Cat )
[c] => Cow
)
❹ php 多个一维关联数组去重
因为不太了解你其他业务,这里通过对多个数组观察发现,他们的键名都是一致的。所以有2个简单的办法
(1)先翻转一维数组,然后进行合并,再翻转回来
这里就不写详细代码,写下简单过程
$array_a =array_flip($array_a);
这样交换后的数组内容如下
Array
(
[DHL] =>carrier
)Array
(
[HKPT] =>carrier
)....
合并数组,使用array_merge,数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值
$mergeArray = array_merge($array_a,$array_b,$array_c...);
这样得到一个数组,里面的元素都是键名不重复的,内容如下
Array
(
[DHL] =>carrier
[HKPT] =>carrier
....
)
还原数组,这里如果要完全打散成一个一个的一维数组,就直接array_shift,同时翻转回来
$array_a =array_shift($mergeArray);$array_a =array_flip($array_a);
$array_b =array_shift($mergeArray);$array_b=array_flip($array_b);
...
这里一个一个执行可以用for循环替代,数组中有多少个元素就执行多少次,
(2)最简单的办法,只从你提供的例子来说,键名都一样,直接先去掉键名,然后组合成一个数字索引的数组,直接array-unique,再把键名放回去
如果有不清楚可以发消息
❺ PHP二维数组如何实现去除重复项
PHP数组去除重复项有个内置函数array_unique(),但是php的array_unique函数只适用于一维数组,对多维数组并不适用,不过你可以在二维数组中的值,用array_unique()即可。
比如:
$array = array(array(1,1,2),array(2,3,4,3));
$temp_array = array();
foreach($array as $key=>$value){
$temp_array[$key] = array_unique($value);
}
$array = $temp_array;
❻ 【php】合并多个数组并去掉相同的
你是要把$tpid数组的内容合并吗,可以先弄了一个空数组,for里面归并到这个空数组,for结束之后进行唯一处理,大致逻辑如下:
<?php
$result=Array();
for($i=0;$i<$num;$i++){
$tpid=$data[$i]['busitype'];
$tpid=explode(".",$tpid,-1);
print_r($tpid);
echo
"<br>";
$result=array_merge($result,$tpid);
}
$result=array_unique($result);
?>
补充:
那是array_merge的问题,重复的下标会被合并,你试试看使用array_merge_recursive吧,我无法测试程序,没有你的数据。
❼ php数组怎么去除重复的数组值
array_unique() 函数定义和用法
移除数组中的重复的值,并返回结果数组。
当几个数组元素的值相等时,只保留第一个元素,其他的元素被删除。
返回的数组中键名不变。
<?php
$a=array("a"=>"XX","b"=>"D","c"=>"XX");
print_r(array_unique($a));
?>
输出:Array ( [a] => XX [b] => D)
❽ php里面如何合并数组
可以使用函数array_merge();
❾ php 大数组合并去重 两个数组元素都过万
过万没关系,如果一个数组内容占一个机器字长,1万才10K WORD而已,现在机器内存很大,几千万都瞬间就处理完了,完全可以按照一般方法编程。
一般方法的合并数组,要看小标是0、1、2、....还是其它的关键字,相同下标的合并还是相同值的合并,具体细节有区别,流程都是一样的:两次for each把两个数组的内容添加到新数组里面。
❿ 关于php 数组合并去重问题
你的数组源一看就不是php数组!! 转化后的结构也不是php数组。
php数据结构是 array(key => value); 而且在php数组中,如果有重复的key,则value值会覆盖之前的数据。