- ベストアンサー
99 - $i*100/$total;
下記リンク先の「2 Answers」の所に、「99 - $i*100/$total;」という記述があるのですが、これは何をしているのでしょうか? 99-「インクリメント値✕100/配列要素数」? http://stackoverflow.com/questions/12089984/find-percentile-using-an-array-in-php
- みんなの回答 (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"; }
補足
回答ありがとうございます。 大変詳しい説明で理解が進んだように思うのですが、まだ分からない点が… 具体的には、「並び替え後の配列の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;としているのはなぜなのでしょうか?