去掉二维数组中的重复组合的实现代码
程序员文章站
2024-01-04 19:32: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); ?> |