当前位置:Gxlcms > PHP教程 > 去掉二维数组中的重复组合的实现代码

去掉二维数组中的重复组合的实现代码

时间:2021-07-01 10:21:17 帮助过:16人阅读

要求将二维数组中组合形式重复的键和值去掉,比如array( array(‘a’ => ‘b’), array(‘b’ => ‘a’) ); 为相同组合, 只保留array(‘a’ => ‘b’)。

注意组合与排列是不同的,(a,b)和(b,a)是相同的组合,但是它们是不同的排列。

小技巧: 1、将二维数组转换为一维数组,具体是把二维数组的键和值进行组合,全部存储在一维数组中,如array(‘a’ => ‘b’),我们将键和值转换成形如a-b的字符串 然后,存储在一维数组中,加’-'是为了后面的比较时,可以还原原来的键值对。

2、转换之后,先把重复的字符串去掉,在示例中是’b-d’,它重复了2次,去掉一个。再进行比较。我们的比较思路是这样的,如存储在一维数组中的键值字符串’a-b’,我们将它在转换成’b-a’,然后在一维数组中进行搜索,如果数组中不存在形如’b-a’的字符串,那么说明’a-b’没有重复的组合,然后将’a-b’拆分,按初始数组的形式存储到二维数组中;如果数组中存在形如’b-a’的字符串,并且位于’a-b’字符串之后,那么,说明‘a-b’字符串存在重复的组合,但是我们仍然将其拆分然后存储在二维数组中。这是因为,重复的组合’b-a’位于’a-b’之后,当我们循环处理到字符串’b-a’时,会得到字符串’b-a’也存在重复的字符串组合’a-b’,但是’a-b’再’b-a’之前,我们已经存储过了,因此’b-a’便不再存储,这样也就达到了去掉重复组合的目的。对于重复字符串的位置的比较,是通过它在一维数组中对应的键名来进行的。

完整代码:

 ‘b’),
array(‘a’ => ‘c’),
array(‘a’ => ‘d’),
array(‘b’ => ‘a’),
array(‘b’ => ‘c’),
array(‘b’ => ‘d’),
array(‘b’ => ‘d’),
array(‘c’ => ‘a’),
array(‘d’ => ‘a’),
array(‘d’ => ‘e’)
);
//循环二维数组,得到一维数组
foreach($array as $key=>$value){
foreach($value as $key2=>$value2){
$new[]=$key2.’-’.$value2;
}
}
//去掉一维数组中的重复项
$new=array_unique($new);
//循环一维数组
foreach($new as $key=>$value){
$varr=explode(‘-’,$value);//拆分字符串
$nval=$varr[1].’-’.$varr[0];//重组字符串
$skey=array_search($nval,$new);//在数组中搜索,字符串,如果有返回键名,没有返回false
//注意这里对flase的比较一定要用===,而不能用==,因为特殊的键0,如果用==比较的话也会被认为是false
if($skey===false||$skey>$key){//如果没有重复组合或者重复组合在当前组合之后
$res[][$varr[0]]=$varr[1];//按初始数组的键值对,重新存储
}
}
//打印最后的结果
print_r($res);
?>

人气教程排行