PHP 移除数组中重复的值 仿 array_unique 函数 以及 进阶函数

20 篇文章 0 订阅
// 注意不要把键值设为0 原因如下
dump(0 == 'a'); // 返回 true

$arr = [
	'a' => 1,
	'b' => 1,
	'' => 'a',
	'c' => 'b',
	'd' => 'a',
];
dump($arr);

// 仿 array_unique 函数
function array_unique2(array &$arr) 
{
	foreach ($arr as $k1 => $v1) {
		if (!isset($arr[$k1])) continue;
		foreach ($arr as $k2 => $v2) {
			if ($k1 == $k2) continue;
			if ($v1 == $v2) unset($arr[$k2]);
		}
	}
}

array_unique2($arr);
dump($arr);

结果如下:

进阶函数1
给数组去重  清除a,b值相等的数据

$arr = [];
for ($i = 0; $i < 5; ++$i) {
	$arr[] = ['a' => mt_rand(0, 1), 'b' => mt_rand(0, 1)];
}
dump($arr);

function array_unique3(array &$arr) 
{
	foreach ($arr as $k1 => $v1) {
		if (!isset($arr[$k1])) continue;
		foreach ($arr as $k2 => $v2) {
			if ($k1 == $k2) continue;
			if ($v1['a'] == $v2['a'] && $v1['b'] == $v2['b']) unset($arr[$k2]);
		}
	}
}

array_unique3($arr);
dump($arr);

执行结果:

进阶函数2:

$arr = [];
for ($i = 0; $i < 5; ++$i) {
	$arr[] = ['a' => mt_rand(0, 1), 'b' => mt_rand(0, 1)];
}
dump($arr);

// 进阶函数2
/**
 * 给任意二维数组去重
 * @param $arr array 需要去重的二维数组 
 * @param $args int/string 任意需要去重的键值,如果键值不存在,自动忽略
 * @return array 返回二维数组(新)
 */
function array_unique4(array $arr, ...$args) 
{
	// 过滤没有的键值
	foreach ($arr as $k1 => $v1) {
		foreach ($args as $k2 => $v2) {
			if (!isset($v1[$v2])) unset($args[$k2]);
		}
	}
	
	if (empty($args)) return $arr; // 没有条件 返回原数组
	
	foreach ($arr as $k1 => $v1) {
		if (!isset($arr[$k1])) continue;
		
		foreach ($arr as $k2 => $v2) {
			if (!isset($arr[$k2]) || $k1 == $k2) continue;
			
			$flag = TRUE;
			
			foreach ($args as $k3 => $v3) {
				if ($v1[$v3] != $v2[$v3]) {
					$flag = FALSE;
					break;
				}
			}
			
			if ($flag) unset($arr[$k2]);
		}
	}
	
	return $arr;
}

$arr = array_unique4($arr, 'a', 'b');
dump($arr);

执行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值