php講座

簡単なアルゴリズム

合計・個数・平均

合計
//配列$valuesの値を順番に足していく
    foreach((array)$values as $value){
        $sum = $sum + $value;
    }
個数
//配列$valuesの値を順に見ていき、それが数値であればカウント変数($count)の数を増やしていく
    foreach((array)$values as $value){
        if(is_numeric($value)){ //is_numeric($value) $valueが数値であればtrue
            $count++;
        }
    }
平均

配列の合計値/配列の中の数値の個数

最大・最小

最大値
//数値配列$valuesの値を順に見ていき、今見ている数値がこれまでの最大値より大きければそれを最大値とする
    $max = $values[0];
    foreach((array)$values as $value){
        if($max <  $value){
            $max =  $value;
        }
    }
最小値
//数値配列$valuesの値を順に見ていき、今見ている数値がこれまでの最小値より小さければそれを最小値とする
    $min = $values[0];
    foreach((array)$values as $value){
        if($min >  $value){
            $min =  $value;
        }
    }

四捨五入

四捨五入

ExcelのROUND関数(ROUND,ROUNDUP,ROUNDDOWN)は与えられた数値が負の時も符号以外は正の値と同じ結果を出す

  • ROUND(-1.2345, 3)→-1.235
  • ROUND(-1.2345, -3)→0
//10をかけたり割ったりして丸めたい桁数が1の位になるようにして、0.5を足して小数を切り捨てる。桁数は戻す
    //対象数値が負の値の時、正負の符号を入れ替える
    if($figure < 0){
        $figure = - $figure;
        $is_negative = true; //正負の入れ替えを行ったことを記憶しておく
    }

    //桁数が正の時(小数点以下を四捨五入)
    if($num >= 0){
        for($i=0; $i<$num ;$i++){
            $figure = $figure*10; //指定の桁数まで繰り上げる
        }
        $figure = (int)($figure + 0.5); //0.5足したものから小数を切り捨て
        for($i=0; $i<$num ;$i++){
            $figure = $figure/10; //桁数を戻す
        }

    //桁数が負の時(10の位、100の位…を四捨五入)
    }else{
        for($i=0; $i>$num ;$i--){
            $figure = $figure/10; //指定の桁数まで繰り下げる
        }
        $figure = (int)($figure + 0.5);  //0.5足したものから小数を切り捨て
        for($i=0; $i>$num ;$i--){
            $figure = $figure*10; //桁数を戻す
        }
    }

    //正負を入れ替えたときには元に戻す
    if($is_negative){
        $figure = - $figure;
    }

※切り上げ、切り捨てを行うにはどうすれば良いか、考えてみよう(0.5を足す代わりに…?)