Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将数组键值转换为百分比_Php_Arrays - Fatal编程技术网

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

Php 如何将数组键值转换为百分比,php,arrays,Php,Arrays,所以我有一个数组,看起来像: Array ( [Safari] => 13 [Firefox] => 5 ) 我如何创建一个新的数组,它看起来像: Array ( [Safari] => 72.2% [Firefox] => 27.7% ) 使用整洁的php函数 提前感谢。您可以使用数组_sum()获取总数,然后迭代返回新值的值 $total = array_sum($share); foreach($share as &$hits) { $hits

所以我有一个数组,看起来像:

Array ( [Safari] => 13 [Firefox] => 5 )
我如何创建一个新的数组,它看起来像:

Array ( [Safari] => 72.2% [Firefox] => 27.7% )
使用整洁的php函数


提前感谢。

您可以使用
数组_sum()
获取总数,然后迭代返回新值的值

$total = array_sum($share);

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

如果您有>=PHP5.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不被触碰,可以使用
array\u map
而不是
array\u walk

您可能还想使用
sprintf
设置表示百分比的浮点值的精度,因为我的代码将输出:

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

不难理解如何操作?

对于PHP5.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;
}

@卡洛斯干杯,让他们继续:)+1非常干净的代码。我想在StackOverflow上有更多这样的代码-1为什么?在我发布时,已接受的答案已经包含了相同的答案,尽管在我添加它时,它没有PHP5.3的此项。我得到了基本相同的答案,得到了-1?这里有一些逻辑…在Laravel中,我得到以下错误:
函数($number)中不支持的操作数类型使用($total){returnnumber\格式($number/$total*100,1)。“%”;},
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;
}