【备忘】一个简单的算法题目:一个二维数组中有多个一维数组,这个一维数组的数据结构一致,但键名可能不一样,要求计算出不重复键名的num值,最后得出不重复键名组成的二维数组。

(为了方便阅读,这是简化过后的题例)

题例:

$gameStatistics = [
    ["game"=>'aaa',"gameid"=>'100',"num"=>3],
    ["game"=>'bbb',"gameid"=>'222',"num"=>92],
    ["game"=>'ccc',"gameid"=>'333',"num"=>3],


    ["game"=>'aaa',"gameid"=>'100',"num"=>3],
    ["game"=>'bbb',"gameid"=>'222',"num"=>15],
    ["game"=>'ccc',"gameid"=>'333',"num"=>33],

    ["game"=>'aaa',"gameid"=>'100',"num"=>33],
    ["game"=>'bbb',"gameid"=>'222',"num"=>133],
    ["game"=>'ccc',"gameid"=>'333',"num"=>38],
    ["game"=>'fff',"gameid"=>'444',"num"=>77],

    ["game"=>'aaa',"gameid"=>'100',"num"=>37],
    ["game"=>'bbb',"gameid"=>'222',"num"=>193],
    ["game"=>'ccc',"gameid"=>'333',"num"=>31],

    //省略更多......
];

最后的结果应该为:

$result = [
    ["game"=>'aaa',"gameid"=>'100',"num"=>???],
    ["game"=>'bbb',"gameid"=>'222',"num"=>???],
    ["game"=>'ccc',"gameid"=>'333',"num"=>???],
    ["game"=>'fff',"gameid"=>'444',"num"=>???],
];

请用代码算出???的结果。

计算过程:


    //$statistics是个二维数组,$statistic是$statistics的一维数组,$statistic参考值如下:
    //array(3) {
    //  ["game"] => string(12) "斗地主"
    //  ["gameid"] => string(3) "520"
    //  ["num"] => int(3)
    //}

    //将不重复数据保存到变量
    $tmp_name_arr1 = [];
    foreach ($statistics as $statistic){
        if(empty($tmp_name_arr1[$statistic['gameid']])){
            $tmp_data = [
                'gameid'=>$statistic['gameid'],
                'num'=>$statistic['num'],
                'game'=>$statistic['game'],
            ];
            $tmp_name_arr1[$statistic['gameid']] = $tmp_data;
        }
        //改进后的代码(之前的写法有问题,会多加一次)
        else{
            $tmp_name_arr1[$statistic['gameid']]["num"] += $statistic['num'];
        }
    }

    //$tmp_name_arr1
    //array(3) {
    //  [100] => array(3) {
    //    ["gameid"] => string(3) "100"
    //    ["num"] => int(1)
    //    ["game"] => string(12) "血战到底"
    //  }
    //  [520] => array(3) {
    //    ["gameid"] => string(3) "520"
    //    ["num"] => int(1)
    //    ["game"] => string(12) "四川麻将"
    //  }
    //  [411] => array(3) {
    //    ["gameid"] => string(3) "411"
    //    ["num"] => int(2)
    //    ["game"] => string(15) "跑得快"
    //  }
    //}
    
    //再计算num值
    //foreach ($tmp_name_arr1 as $key_id=>&$arr1){
    //    foreach ($gameStatistics as $stat1){
    //       if($stat1['gameid'] == $key_id){
    //            $arr1['num'] += $stat1['num'];
    //        }
    //    }
    //}

    //unset($arr1);//删除引用

    var_dump($tmp_name_arr1);

有兴趣的朋友可以试试其它算法。

以上由自己思考得出方法,还有改进空间,还有工作要做,后续再改进......

END

Guess you like

Origin blog.csdn.net/qq_15941409/article/details/120287113