2011-05-27 40 views
5

所以我有一個數組,看起來像的:如何數組關鍵值轉換爲百分比

Array ([Safari] => 13 [Firefox] => 5) 

如何IA作出新的陣列看起來像:

Array ([Safari] => 72.2% [Firefox] => 27.7%) 

使用一個整潔的PHP功能?

在此先感謝。

回答

15

您可以使用array_sum()來獲得總數,然後迭代返回新值的值。

$total = array_sum($share); 

foreach($share as &$hits) { 
    $hits = round($hits/$total * 100, 1) . '%'; 
} 

CodePad

如果您有> = PHP 5.3,使用匿名函數可以更優雅。

$total = array_sum($share); 

$share = array_map(function($hits) use ($total) { 
    return round($hits/$total * 100, 1) . '%'; 
}, $share); 

CodePad

+1

喲你是PHP陣列忍者...! – 2011-05-27 01:00:43

+1

@Carlos乾杯,保持他們的到來:) – alex 2011-05-27 01:03:35

+5

+1非常乾淨的代碼。我想在StackOverflow上獲得更多這樣的代碼! – Tadeck 2011-05-27 01:11:03

0

試試這個:

$array = Array ('Safari' => 13, 'Firefox' => 5); 
$total = array_sum($array); # total sum of all elements 
$onePercent = $total/100; # we want to know what value represents 1 percent 
array_walk($array, create_function('&$v', '$v /= '.$onePercent.'; $v .= " %";')); # we walk through the array changing numbers to percents 
var_export($array); 

如果你想擁有你的結果在第二array留下$數組不是感動,你可以使用array_map代替array_walk

你也可能要使用sprintf設置代表百分比的浮點值精度,因爲我的代碼會輸出:

array (
    'Safari' => '72.2222222222 %', 
    'Firefox' => '27.7777777778 %', 
) 

這並不難弄清楚如何做到這一點?

0

對於PHP 5.3中,你可以做這樣的:

$browsers = array('Safari' => 13, 'Firefox' => 5); 

$browsers_proportioned = proportionalize($browsers); 

function proportionalize ($arr) { 
    $total = array_sum($arr); 
    $names = array_map(
      function($number) use ($total) { return number_format($number/$total * 100, 1) .'%'; }, 
      $arr 
    ); 
    return $names; 
} 
+0

-1爲什麼?接受的答案在我發佈的時候包含了相同的答案,儘管在添加PHP5.3時它沒有這個項目。我有基本相同的答案,得到-1?這裏的一些邏輯請... – 2011-05-27 05:35:16

+0

在Laravel我得到以下錯誤:*不支持的操作數類型*在函數($數)使用($總){返回number_format($數/ $總* 100,1)。'% 「; }' – Pathros 2015-02-16 18:24:49

2
$array=array ('Safari' => 13 ,'Firefox' => 5); 
    $tot=array_sum($array); 

    foreach($array as $key=>$value){ 
     $result[$key]=number_format(($value/$total)*100,1).'%'; 
    } 

    print_r($result); //Array ([Safari] => 72.2% [Firefox] => 27.7%) 
0

我personnally喜歡當數字加起來正好100(幾乎不象100 99.99)。所以下面的解決方案,最後一項使用其餘項而不是像其他項目計算:

public static function getPercentagesByKeyValue(array $arr) 
{ 
    $ret = []; 
    $nbItems = count($arr); 
    $i = 1; 
    $sum = array_sum($arr); 
    foreach ($arr as $key => $number) { 
     $percent = round($number/$sum * 100, 2); 
     if ($i === $nbItems) { 
      $percent = 100 - (array_sum($ret)); 
     } 
     $ret[$key] = $percent; 
     $i++; 
    } 
    return $ret; 
}