2

次の配列があります。

[ratings] => Array
 (
      [0] => 3
      [1] => 3
      [2] => 2
      [3] => 3
      [4] => 3
      [5] => 1
      [6] => 3
      [7] => 4
      [8] => 5
 )

各評価のパーセンテージを取得するための最良かつ最速の方法は何でしょうか. たとえば、現在 9 件の評価があり、「3」の評価が 5 件あるため、評価「3」の割合は 55.55% です。

4

6 に答える 6

5

彼はおそらくすでに何かを持っているでしょうが、これは私が思いついたものです。

<?php
$array = array(3,3,2,3,3,1,3,4,5);

function array_avg($array, $round=1){
    $num = count($array);
    return array_map(
        function($val) use ($num,$round){
            return array('count'=>$val,'avg'=>round($val/$num*100, $round));
        },
        array_count_values($array));
}

$avgs = array_avg($array);

/*
 * You can access any average/count like:
 * echo "The count of 3 is: {$avgs[3]['count']}";
 * echo "The average of 3 is: {$avgs[3]['avg']}";
 */

echo '<pre>'.print_r($avgs,1).'</pre>';

出力:

Array
(
    [3] => Array
        (
            [count] => 5
            [avg] => 55.6
        )

    [2] => Array
        (
            [count] => 1
            [avg] => 11.1
        )

    [1] => Array
        (
            [count] => 1
            [avg] => 11.1
        )

    [4] => Array
        (
            [count] => 1
            [avg] => 11.1
        )

    [5] => Array
        (
            [count] => 1
            [avg] => 11.1
        )
)

http://codepad.viper-7.com/yD9CQm

于 2012-10-25T21:22:15.877 に答える
3
function findPercentage($r, $ratings){
    $arr = array_count_values($ratings);
    return $arr[$r]/count($ratings) * 100;
}
于 2012-10-25T21:32:18.653 に答える
1

コメントしたように、単純な反復でarray_count_valuesand プロセスを利用できます。count

私のコード例では、これを独自の関数にラップしています。

$ratings = [3,3,2,3,3,1,3,4,5];

$percentages = function($ratings) {
    $total = count($ratings);
    $percentages = [];
    foreach(array_count_values($ratings) as $value => $count) {
        $percentages[$value] = $count / $total;
    }
    return $percentages;    
};

print_r($percentages($ratings));

出力 (デモ):

Array (
    [3] => 0.55555555555556
    [2] => 0.11111111111111
    [1] => 0.11111111111111
    [4] => 0.11111111111111
    [5] => 0.11111111111111
)

これがそれをかなりうまく示していることを願っています。そして再び(楽しみのために):

print_r($percentages(array_map('strval', $percentages($ratings))));

( array_count_values()STRING および INTEGER 値のみをカウントできます)

出力:

Array (
    [0.55555555555556] => 0.2
    [0.11111111111111] => 0.8
)
于 2012-10-25T21:37:08.293 に答える
0
// $ratings is your array

function findPercentage($r, $ratings){
$count = 0; // count number of particular ratings
    foreach ($ratings as $i){
        if ($i == $r) $count++;
}

return $count/count($ratings) * 100;

}

例:

echo findPercentages(3, $ratings);
于 2012-10-25T20:59:36.903 に答える
0

$avg = array_sum($a)/count($a)

Javascript で:

var a = [1,2,3,4,5,6]; 
var avg = a.reduce(function(a,b){ return a+b })/a.length;
于 2012-10-25T20:49:18.950 に答える
-1
$rating = array(3, 3, 5, 5, 3, 4);

$value = 0;
foreach ($rating as $i) {
    $value += $i;
}
$percentage = $value / count($rating);

echo $percentage;

== 更新

私は小さなテストを書きました:

$rating = array();

echo "create array".PHP_EOL;

for ($i = 0; $i < 100000; $i++) {
    $rating[] = rand(1, 5);
}


echo "foreach algorithm: ".PHP_EOL;
$time = microtime();

$value = 0;
foreach ($rating as $i) {
    $value += $i;
}
$percentage = $value / count($rating);


echo $percentage.PHP_EOL;
echo "time is ".(microtime() - $time).PHP_EOL;

echo "array_sum algorithm: ".PHP_EOL;
$time = microtime();

$avg = array_sum($rating)/count($rating);
echo "time is ".(microtime() - $time).PHP_EOL;   

そして結果:

create array
foreach algorithm: 
2.99924
time is 0.017117
array_sum algorithm: 
time is 0.002819

回答: ユーザー @Reflective を記述したアルゴリズムを使用し、関数array_sumを使用します。

于 2012-10-25T20:44:08.487 に答える