• ベストアンサー

99 - $i*100/$total;

下記リンク先の「2 Answers」の所に、「99 - $i*100/$total;」という記述があるのですが、これは何をしているのでしょうか? 99-「インクリメント値✕100/配列要素数」? http://stackoverflow.com/questions/12089984/find-percentile-using-an-array-in-php

質問者が選んだベストアンサー

  • ベストアンサー
  • cheese014
  • ベストアンサー率85% (12/14)
回答No.1

> 99-「インクリメント値×100/配列要素数」? 正解です。 > これは何をしているのでしょうか? 回答者が↓と書いてますよね。 > 1.Sort the array based on the "score", ascending > 2.Percentile = (Index of an element in the sorted array) * 100 / (total elements in the array) 1.配列をスコアを元に「昇順」で並び替えると、 2.パーセンタイル = 並び替え後の配列のindex値 × 100 ÷ 配列の要素数 で求められる つまり… > $i * 100 / $total; …は、上記説明の2をそのまま式にしただけです。 ですが、回答者のコードは、説明とは裏腹に配列をスコアの「降順」でソート(arsort($array);)してからループで回してますので、 > $percentile = 99 - $i*100/$total; …という式になっています。一気に色々やらずに段階を踏んだコードだと、冗長にはなりますが、例えば↓みたいになると思います。※全角スペースは半角に置き換えてください。 $dataAry = array(   45 => 5,   42 =>4.9,   48 => 5,   41 => 4.8,   40 => 4.9,   34 => 4.9 ); //-- スコア別に集計 $aggregateAry = array(); foreach ($dataAry as $id => $score) {   if (isset($aggregateAry["{$score}"])) {     $aggregateAry["{$score}"][] = $id;   } else {     $aggregateAry["{$score}"] = array($id);   } } //-- 集計結果をスコアの「昇順」でソート ksort($aggregateAry, SORT_NUMERIC); print_r($aggregateAry); //-- パーセンタイル値を求める $cntData = count($dataAry); $percentile = -1; foreach ($aggregateAry as $score => $idAry) {   $percentile += (100 / $cntData) * count($idAry);   echo 'ID:', implode(',', $idAry), '/Score:', $score, ' => ', $percentile, "\n"; }

re97
質問者

補足

回答ありがとうございます。 大変詳しい説明で理解が進んだように思うのですが、まだ分からない点が… 具体的には、「並び替え後の配列のindex値」とは何を指すのでしょうか? Array (   [4.8] => Array     (       [0] => 41     )   [4.9] => Array     (       [0] => 42       [1] => 40       [2] => 34     )   [5] => Array     (       [0] => 45       [1] => 48     ) ) count($idAry)なので、それぞれ、1、3、2だと思うのですが、 $percentile = (count($idAry) × 100 ÷ 配列の要素数))-1;ということでしょうか? $percentile = -1;としているのはなぜなのでしょうか?