PHP数组唯一函数array_unique对二维数组的处理

PHP唯一数组函数array_unique的官方功能说明,移除数组中的重复的值,并返回结果数组,当几个数组元素的值相等时,只保留第一个元素,其他的元素被删除。返回的数组中键名不变。array_unique() 先将值作为字符串排序,然后对每个值只保留第一个遇到的键名,接着忽略所有后面的键名。这并不意味着在未排序的 array 中同一个值的第一个出现的键名会被保留。

很显然,array_unique官方解释是针对一维数组的,但是很多情况下,我们要对二维数组进行去重复的操作,就想当然的也使用了array_unique函数,但却只返回了二维数组中的第一个数组,很明显二维数组不能用array_unique函数去重复,那么该怎么办呢?

把二维数组降成一维数组

1、把二维数组降维,二维数组变一维数组。

2、用array_unique唯一数组函数对降维后的数组去重复处理。

3、把去重复后的一维数组,恢复成二维数组,同时保留原二维数组中一维数组的键名。

有了解决问题的思路,下面就看具体的解决办法,如下一个二维数组:

//内容是大家熟悉的“元芳”
array(
	array('id'=>1, 'title'=>'元芳', 'score'=>10),
	array('id'=>2, 'title'=>'元芳,你怎么看', 'score'=>10),
	array('id'=>3, 'title'=>'大人说:元芳,你怎么看', 'score'=>9),
	array('id'=>1, 'title'=>'元芳', 'score'=>10),
);
下面是二维数组去重复的函数代码:
function unique($data = array()){
	$tmp = array();
	foreach($data as $key => $value){
		//把一维数组键值与键名组合
		foreach($value as $key1 => $value1){
			$value[$key1] = $key1 . '_|_' . $value1;//_|_分隔符复杂点以免冲突
		}
		$tmp[$key] = implode(',|,', $value);//,|,分隔符复杂点以免冲突
	}

	//对降维后的数组去重复处理
	$tmp = array_unique($tmp);

	//重组二维数组
	$newArr = array();
	foreach($tmp as $k => $tmp_v){
		$tmp_v2 = explode(',|,', $tmp_v);
		foreach($tmp_v2 as $k2 => $v2){
			$v2 = explode('_|_', $v2);
			$tmp_v3[$v2[0]] = $v2[1];
		}
		$newArr[$k] = $tmp_v3;
	}
	return $newArr;
}
$data = array(
	array('id'=>1, 'title'=>'元芳', 'score'=>10),
	array('id'=>2, 'title'=>'元芳,你怎么看', 'score'=>10),
	array('id'=>3, 'title'=>'大人说:元芳,你怎么看', 'score'=>9),
	array('id'=>1, 'title'=>'元芳', 'score'=>10),
);
$newArr = unique($data);
//去重复后的二维数组
Array
(
    [0] => Array
        (
            [id] => 1
            [title] => 元芳
            [score] => 10
        )

    [1] => Array
        (
            [id] => 2
            [title] => 元芳,你怎么看
            [score] => 10
        )

    [2] => Array
        (
            [id] => 3
            [title] => 大人说:元芳,你怎么看
            [score] => 9
        )

)

至此二维数组的去重复问题得以解决,至于这个函数的效率没去测试,不过也就是2个2层的foreach循环,对于长度很小的二维数组来说,肯定不在话下,诸位如有疑问,请http://tech.42xiu.com/php-array-unique.html留言讨论。

由 PHP乐知博客 提供 http://tech.42xiu.com/php-array-unique.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值