所以我有一个数组,看起来像:
Array ( [Safari] => 13 [Firefox] => 5 )
如何制作一个新的阵列,看起来像:
Array ( [Safari] => 72.2% [Firefox] => 27.7% )
使用整洁的php函数?
提前谢谢。
您可以使用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。
$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% )
试试这个:
$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没有被触摸,你可以使用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;
}
我个人喜欢数字加起来正好是100(而不是像99.99那样几乎是100)。因此,在下面的解决方案中,最后一项使用其余项,而不是像其他项那样计算:
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;
}