- ベストアンサー
99 - $i*100/$total;
下記リンク先の「2 Answers」の所に、「99 - $i*100/$total;」という記述があるのですが、これは何をしているのでしょうか? 99-「インクリメント値✕100/配列要素数」? http://stackoverflow.com/questions/12089984/find-percentile-using-an-array-in-php
- re97
- お礼率80% (601/744)
- PHP
- 回答数1
- ありがとう数0
- みんなの回答 (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"; }
関連するQ&A
- 繰り返し処理が上手くいかない
foreach($ARR_SCATTER as $val){ //人数分繰り返す //値を分解 $EXPLODE_VALUE = explode(",", $val); //質問1の値を配列に $QUESTION_NO[1][] = $EXPLODE_NUM[0]; //質問2の値を配列に $QUESTION_NO[2][] = $EXPLODE_NUM[1]; //質問3の値を配列に $QUESTION_NO[3][] = $EXPLODE_NUM[2]; //質問4の値を配列に $QUESTION_NO[4][] = $EXPLODE_NUM[3]; //質問5の値を配列に $QUESTION_NO[5][] = $EXPLODE_NUM[4]; //最後の質問の値を配列に $LAST_QUESTION[] = $EXPLODE_NUM[5]; $TOTAL[1] = $QUESTION_NO[1] + $LAST_QUESTION; $TOTAL[2] = $QUESTION_NO[2] + $LAST_QUESTION; $TOTAL[3] = $QUESTION_NO[3] + $LAST_QUESTION; $TOTAL[4] = $QUESTION_NO[4] + $LAST_QUESTION; $TOTAL[5] = $QUESTION_NO[5] + $LAST_QUESTION; } という処理を繰り返し処理をつかって記述したいのですが、うまくいきません。 下記のように記述しましたが、なぜか配列に値が1つしかはいりません。 (質問数は変動、言語はPHP5) foreach($ARR_SCATTER as $val){ //人数分繰り返す //値を分解 $EXPLODE_NUM = explode(",", $val); } for($test =0; $test <= $for_arr_count; $test++){ //質問の値を配列に $QUESTION_NO[$test][] .= $EXPLODE_RADIO_NUM[$test]; //最後の質問の値を配列に $LAST_QUESTION[] = $EXPLODE_RADIO_NUM[5]; $TOTAL[] = $QUESTION_NO[$test] + $LAST_QUESTION; $test++; } 原因がわからず困っています。 アドバイスお願いいたします。
- ベストアンサー
- PHP
- 可変長の配列要素を文字列に代入する方法
ちょっとしばらくPHPやってなかったもので、へんなことで悩んでいます。 配列要素が固定長の場合、 <?php $a = array(1, 2, 3); //固定長3の場合 $data = "$a[0], $a[1], $a[2]"; //文字列$dataに配列要素を代入 ?> と簡単にできてしまいますが、 $aが可変長の配列であった場合にも同様の事がやりたいのですが、 この場合、PHPの記述としてはどう書くのがベストなのでしょうか? 御教示ください。
- ベストアンサー
- PHP
- 配列の並びについて
配列要素が思うように並んでくれません。 (1)のような配列を(2)のように配列要素を記述した順番で出力したいのですが、可能かどうか教えてください。 (1) $ary=array( "001"=>array("en"=>"TOYOTA","jp"=>"トヨタ"), "003"=>array("en"=>"HONDA","jp"=>"ホンダ"), "002"=>array("en"=>"NISSAN","jp"=>"日産") ); (2) Array([001]=>XXX [003]=>XXX [002]=>XXX) ↑このように出力したいのですが、自動的にソートされて Array([001]=>XXX [002]=>XXX [003]=>XXX)となります。 よろしくご教授下さい。お願いします。
- ベストアンサー
- PHP
- 配列を返す関数から、一つの要素だけ取り出したい。
例えば、配列を返す関数、get_array がある時、 その配列の0番目の要素だけが欲しい時、 Perlでは、 $val = get_array[0]; (配列リファレンスを返す場合は、$val = get_array->[0]; ) みたいな感じで書けたと思いますが、 PHPでは、 $val = get_array()[0]; みたいに書けないですよね? 以下のように、二行で書かなければダメですか? $array = get_array(); $val = $array[0];
- ベストアンサー
- PHP
- 配列型の宣言?
こんにちは。 あるサイトで見たphpのサンプルなのですが、 postされた全ての値を配列に格納するもので、以下のような記述がありました。 foreach((array)$_POST as $key => $value){ $array[$key] = $value; } ポストされた全ての値を、配列$arrayに連想配列として格納しているのはわかるのですが、 foreachの、(array)というのはどういう働きをするものなのでしょうか。 これは、$_POSTが配列であるという宣言でしょうか。 それと、postされた値がない場合、$_POSTを配列だと宣言しておくことで、foreachのエラーを回避するような役割もあるのでしょうか。 恥ずかしながら、(array)のような記述をphpではあまり見ないような気がするのですが、なんというキーワード(?)で勉強すれば理解が深められるかもご教授頂けますと助かります。 宜しくお願い申し上げます。
- ベストアンサー
- PHP
- 連想配列の一部分を全て表示したいのですが・・。
すみません。phpの事はあまりわからないのですが、以下のような連想配列がありまして、 (下記のような連想配列が大量にあります。) Array ( [0] => Array ( [a] => 1111 [0] => 1111 [b] => 2222 [1] => 2222 [c] => 3333 [2] => 3333 ) [1] => Array ( [a] => 5555 [0] => 5555 [b] => 6666 [1] => 6666 [c] => 7777 [2] => 7777 ) ) 上の配列から下記の配列のみ全て表示したいのですがどう記述したらよいでしょうか。 Array[0][a] Array[0][b] Array[0][c] Array[1][a] Array[1][b] Array[1][c]
- ベストアンサー
- PHP
- ActionScriptについて
今、ActionScriptのトレーニングブックで練習している初心者です。 練習問題で、配列の34, 40, 12, 30, 24, 55, 70, 60, 52, 43, 65, 30, 45, 20, 15を全て足したいのですが、 出力すると、 「すべての予約済み座席数は014131211109876543210人です」 と出てきてしまいます。(595と出てくるはずだと思うんです) 本の通りに記述してみたはずなのですが、どこか変なのでしょうか? var reserved_array = [34, 40, 12, 30, 24, 55, 70, 60, 52, 43, 65, 30, 45, 20, 15]; var total_num = 0; for (var i in reserved_array) { total_num += i; } trace("すべての予約済み座席数は"+total_num+"人です");
- ベストアンサー
- Flash
- PHPのようにスマートに配列の配列など記述する方法が
PHPの場合、データ構造ですが以下のようになっています。 $a = array( "test1" => array( array(1,1), array("x", 2) ), "test2" => array( array(3,2), array("y", 1) ), ); これをエクセルVBAの場合、Scripting.Dictionaryを使えば連想配列が 可能ですが、PHPのようにスマートに配列の配列など記述する方法が わかりません。 Dim dic As Scripting.Dictionary set dic = New Scripting.dictionary dic.Add "test1", ???????????????? dic.Add "test2", ???????????????? スマートにデータ構造を実現できる方法が知りたいです。
- ベストアンサー
- オフィス系ソフト
- URLエンコードした配列を使う方法
<php $data[5] = array(6,4,3,7,9); ?> <a href='image.php? <?php print http_build_query($data,'','&'); ?> '>リンク先</a> リンク先へのURLの後ろにhttp_build_queryを使いつけて 送り側で$_GETで受け取って配列を使うようなことを しようと思ったのですが Undefined index: dataと言われてうまくいきません。 どのようにして配列を取り出せばよいのでしょうか?
- ベストアンサー
- PHP
補足
回答ありがとうございます。 大変詳しい説明で理解が進んだように思うのですが、まだ分からない点が… 具体的には、「並び替え後の配列の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;としているのはなぜなのでしょうか?