如何将数组键值转换为百分比

5
我有一个类似以下的数组:
Array ( [Safari] => 13 [Firefox] => 5 )

如何创建一个新的数组,使其看起来像这样:
Array ( [Safari] => 72.2% [Firefox] => 27.7% )

使用一个整洁的PHP函数吗?
提前感谢。
5个回答

17
您可以使用 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
@Carlos 加油,继续来吧 :) - alex
5
非常干净的代码。我希望在StackOverflow上能看到更多这样的代码! - Tadeck

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

我个人喜欢数字总和恰好为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;
}

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;
}

-1 是什么意思?当我发表回答时,已经有其他人提供了相同的答案,尽管当时针对 PHP5.3 的部分还未包含在内。我基本上是在提供相同的答案,为什么会得到 -1 分呢?请问这里存在哪些逻辑…… - Brett Zamir
在Laravel中,我遇到了以下错误:不支持的操作数类型function($number) use ($total) { return number_format($number / $total * 100, 1) .'%'; },中。 - Pathros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接