2011-05-27 17 views

Respuesta

15

Puede usar array_sum() para obtener el total, luego itere sobre los valores que devuelven el nuevo valor.

$total = array_sum($share); 

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

CodePad.

Si tiene> = PHP 5.3 puede ser un poco más elegante con una función anónima.

$total = array_sum($share); 

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

CodePad.

+1

yo hombre eres el PHP matriz Ninja ... !! –

+1

@Carlos Saludos, sigan viniendo :) – alex

+5

+1 Código muy limpio. ¡Quiero más de ese código en StackOverflow! – Tadeck

0

Prueba esto:

$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); 

Si usted quiere tener su resultado en el segundo array dejando $ array no se toca, puede utilizar array_map en lugar de array_walk

También puede ser que desee utilizar sprintf para establecer la precisión de los valores de coma flotante que representan ciento, porque mi código sería de salida:

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

no es difícil para descubrir cómo hacerlo?

0

Para PHP 5.3, puede hacerlo de esta manera:

$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 ¿para qué? La respuesta aceptada incluía la misma respuesta cuando publiqué, aunque no tenía este elemento para PHP5.3 cuando lo estaba agregando. Tengo esencialmente la misma respuesta y obtengo un -1? Algo de lógica aquí por favor ... –

+0

En Laravel me sale el siguiente error: * Tipos de operandos no soportados * En 'función ($ número) uso ($ total) {return number_format ($ number/$ total * 100, 1). '% '; }, ' – Pathros

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

personalmente me gusta cuando los números se suman exactamente el 100 (por no decir casi 100 como 99,99). Así, con la solución a continuación, el último elemento utiliza el resto en lugar de ser calculada como otros artículos:

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