PHP 多次元配列の重複排除 (任意のキー値の重複排除) - 2 次元配列の一意性 - 時間計算量 ~On

WBOY
リリース: 2016-07-29 09:15:04
オリジナル
1100 人が閲覧しました

2 次元配列を例として、任意のキー値の重複排除を説明します。foreach ループを 1 つだけ使用すると、時間計算量は ~O(n) になります。

<?php 
$arr = array(
                     &#39;0&#39;=>array(
                            'name'=>'james',
                            'age'=>30,
                              ),
                     '1'=>array(
                            'name'=>'susu',
                            'age'=>26,
                             ),
                     '2'=>array(
                            'name'=>'james',
                            'age'=>30,
                              ),
                     'new'=>array(
                            'name'=>'kube',
                            'age'=>37,
                              ),
                     'list'=>array(
                            'name'=>'kube',
                            'age'=>27,
                              ),
                    );
 /*针对任意键值来进行去重*/
               function getArrayUniqueByKeys($arr)
               {
                   $arr_out =array();
                   foreach($arr as $k => $v)
                   {
                        $key_out = $v['name']."-".$v['age']; //提取内部一维数组的key(name age)作为外部数组的键

                        if(array_key_exists($key_out,$arr_out)){
                            continue;
                        }
                        else{
                             $arr_out[$key_out] = $arr[$k]; //以key_out作为外部数组的键
                             $arr_wish[$k] = $arr[$k];  //实现二维数组唯一性
                        }
                   }
                   return $arr_wish;
               }
               $arr_wish = getArrayUniqueByKeys($arr);
               printf("As for the arbitrarily key:<br>");
               print_r($arr_wish);
               echo "<br/>";

?>
ログイン後にコピー

出力結果:

任意キー:
Array ( [0] => Array ( [名前] => ジェームス [年齢] => 30 ) [1] => Array ( [名前] => スース [年齢] = > ; 26 ) [新しい] => 配列 ( [名前] => クベ [年齢] => 37 ) [リスト] => 配列 ( [名前] => クベ [年齢] => 27 ) )

開発例: クーポンの重複排除 (オファー金額-注文金額フィールドを繰り返し使用する重複を削除)

要件: 割引額注文金額と同額のクーポン。ユーザーが選択できるクーポンを 1 つだけ表示する必要があり、有効期限が最も早いクーポンが表示されます:

<?php
       $arrCoupon = array(
            &#39;0&#39;=>array(
                'couponCode' => '3033323852301056',
                'usableStartTime' => "1439740800",
                'usableEndTime'=>"1440798100",
                'couponAmount'  =>100,
                'orderAmount'=> 800,
                ),
            '1'=>array(
                'couponCode' => '3033323852301057',
                'usableStartTime' => "1439740800",
                'usableEndTime'=>"1440768100",
                'couponAmount'  =>100,
                'orderAmount'=> 800,
            ),
            '2'=>array(
                'couponCode' => '3033323852301058',
                'usableStartTime' => "1439740800",
                'usableEndTime'=>"1440788100",
                'couponAmount'  =>100,
                'orderAmount'=> 800,
            ),
            '3'=>array(
                'couponCode' => '3033323852301059',
                'usableStartTime' => "1439740800",
                'usableEndTime'=>"1440779100",
                'couponAmount'  =>200,
                'orderAmount'=> 800,
            ),
            '4'=>array(
                'couponCode' => '3033323852301060',
                'usableStartTime' => "1439740800",
                'usableEndTime'=>"1440758100",
                'couponAmount'  =>200,
                'orderAmount'=> 800,
            ),
            '5'=>array(
                'couponCode' => '3033323852301061',
                'usableStartTime' => "1439740800",
                'usableEndTime'=>"1440798100",
                'couponAmount'  =>200,
                'orderAmount'=> 800,
            ),
        );
        //print_r($arrCoupon);
        function getArrayUniqueByKey($arr)
        {
        $arrWish = array();
        $today = time();
        foreach ($arr as $k => $v) {
            if (($v['usableStartTime'] <= $today) && ($today <= $v[&#39;usableEndTime&#39;])) { //先确定优惠券的可用日期
                $keyOut = $v[&#39;couponAmount&#39;] . "-" . $v[&#39;orderAmount&#39;]; 
                //提取内部一维数组的key(couponAmount orderAmount)作为外部数组的键
                if (array_key_exists($keyOut, $arrWish)) {
                    //展现最先到期的优惠券
                    if (intval($arrWish[$keyOut][&#39;usableEndTime&#39;]) > intval($v['usableEndTime'])) {
                        $arrWish[$keyOut] = $v;  //如果原来数组中结束时间大的话,就交换值
                    }
                    continue;
                }
                $arrWish[$keyOut] = $v;  //实现二维数组唯一性
            }
            continue;
        }
        return $arrWish;
        }
        $arrWant = getArrayUniqueByKey($arrCoupon);
        print_r($arrWant);
?>
ログイン後にコピー

出力結果:

Array( [

100- 800] =>配列 ([クーポンコード] => 3033323852301057 [使用可能開始時間] => 1439740800[使用可能終了時間] => 1440768100 [クーポン金額] => 100 [注文金額] =>800 ) [ 200-800 ]=> Array ( [クーポンコード] => 3033323852301060 [使用可能開始時間] => 1439740800 [使用可能終了時間] => 1440758100 [クーポン金額] => 200 [注文金額]=> 800 ) )

以上、PHPにおける多次元配列の重複排除(任意のキー値の重複排除)~二次元配列の唯一のこと~時間計算量~についての側面も含めて紹介しましたので、PHPチュートリアルに興味のある方はぜひご一読ください。役に立ちました。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート