1. 程式人生 > >php二維陣列去重

php二維陣列去重

php二維陣列去重


前言:php一維陣列去重很簡單,直接array_unique($arr)即可,但是二維陣列去重就得自己去寫了

二維陣列去重方法:

/*
 * 二維陣列去重
 * 注意:二維陣列中的元素個數必須一致,且鍵值也得一致,否則無意義
 * @param array $arr
 * @return array $arr_after
 */
public function array_unique_2DArr($arr=array()){
    if(empty($arr) || !is_array($arr)){
        return array();
    }
    /*******處理二維陣列個數不一致問題  start 其他專案用可以去掉*******/
    //判斷陣列中二維陣列是否包含uniqueId,存在的話需要處理其他的日誌資訊,全部加上uniqueId,且uniqueId值必須相同
    $hasUniqueId = false;
    foreach($arr as $val){
        if(array_key_exists('uniqueId', $val)){
            $hasUniqueId = true;
            break;
        }
    }
    //如果$arr中的二維陣列中uniqueId存在,則其他也增加
    if($hasUniqueId){
        foreach($arr as $_k=>$_val){
            if(!array_key_exists('uniqueId', $_val)){
                //在$_val中增加unique,只是為了和其他的帶有uniqueId鍵值的陣列元素個數保持一致       
                $_val_keys = array_keys($_val);
                $_val_vals = array_values($_val);
                array_unshift($_val_keys, 'uniqueId');
                array_unshift($_val_vals, '0_0');
                $arr[$_k] = array_combine($_val_keys, $_val_vals);
            }
        }
    }
    /********處理二維陣列個數不一致問題  end********/
    foreach($arr[0] as $k => $v){  
        $arr_inner_key[]= $k;   //先把二維陣列中的內層陣列的鍵值記錄在在一維陣列中  
    }
    foreach ($arr as $k => $v){  
        $v =join("^",$v);   //降維 用implode()也行 ,注意,拆分時不能用逗號,用其他的不常用符號,逗號可能會由於資料本身含有逗號導致失敗
        $temp[$k] =$v;      //保留原來的鍵值  
    }
    $temp =array_unique($temp);    //去重:去掉重複的字串
    foreach ($temp as $k => $v){  
        $a = explode("^",$v);   //拆分後的重組 
        $arr_after[$k]= array_combine($arr_inner_key,$a);  //將原來的鍵與值重新合併  
    }
    return $arr_after;  
}