所以我有一个数组,看起来像的:如何数组关键值转换为百分比
Array ([Safari] => 13 [Firefox] => 5)
如何IA作出新的阵列看起来像:
Array ([Safari] => 72.2% [Firefox] => 27.7%)
使用一个整洁的PHP功能?
在此先感谢。
所以我有一个数组,看起来像的:如何数组关键值转换为百分比
Array ([Safari] => 13 [Firefox] => 5)
如何IA作出新的阵列看起来像:
Array ([Safari] => 72.2% [Firefox] => 27.7%)
使用一个整洁的PHP功能?
在此先感谢。
您可以使用array_sum()
来获得总数,然后迭代返回新值的值。
$total = array_sum($share);
foreach($share as &$hits) {
$hits = round($hits/$total * 100, 1) . '%';
}
如果您有> = PHP 5.3,使用匿名函数可以更优雅。
$total = array_sum($share);
$share = array_map(function($hits) use ($total) {
return round($hits/$total * 100, 1) . '%';
}, $share);
试试这个:
$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 %',
)
这并不难弄清楚如何做到这一点?
对于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?这里的一些逻辑请... – 2011-05-27 05:35:16
在Laravel我得到以下错误:*不支持的操作数类型*在函数($数)使用($总){返回number_format($数/ $总* 100,1)。'% “; }' – Pathros 2015-02-16 18:24:49
$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%)
我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;
}
哟你是PHP阵列忍者...! – 2011-05-27 01:00:43
@Carlos干杯,保持他们的到来:) – alex 2011-05-27 01:03:35
+1非常干净的代码。我想在StackOverflow上获得更多这样的代码! – Tadeck 2011-05-27 01:11:03