2013-06-26 2 views
0

Я чувствую, что должен быть более простой способ справиться с этой проблемой; поэтому у меня есть многомерный массив так:Простой способ суммировать все заданные значения столбца в многомерном массиве?

$reports = array(
    array("Complete Installation", 1), 
    array("Register + OSR Install", 0), 
    array("OSR + Wire", 0), 
    array("OSR Only", 1), 
    array("Ground Strap Installation", 2), 
    array("Meter Only", 2) 
); 

И я хотел бы показать процент из общей стоимости второй (ну, во-первых, но вы знаете, что я имею в виду) столбец Array. Сейчас я использую foreach, но это, кажется, действительно излишним и не очень эффективно:

foreach($reports as $report) { 
    $total_val += (int)$report[1]; 
} 
foreach($reports as $report) { 
    $name = $report[0]; 
    $val = (int)$report[1]; 
?> 
<tr> 
    <td><?=(stripslashes($name));?></td> 
    <td><?=($val);?></td> 
    <td><?=(($val > 0) ? round(($val/$total_val) * 100, 2) : $val);?></td> 
</tr> 

Я чувствую, что должен быть лучший способ справиться с этим, в заказ, чтобы получить переменную $total_val = 6; без повторного петля Array. Способ добавить все $report[1]. Есть идеи?

+0

Как общий комментарий, подобранные таким образом массивы делают меня неспокойным. Для неравномерных данных вы должны использовать ассоциативные массивы, например. 'array ('type' => 'Complete Installation', 'value' => 1)'. – Barmar

ответ

5

При запуске PHP 5.5 он мертв легко:

$total = array_sum(array_column($reports, 1)); 

Если вы этого не сделаете, то либо foreach (нет ничего плохого - наоборот, просто хорошо) или некоторые фантазии альтернативы:

// If you go fancy this should be your choice, the others are slightly inferior 
$total = array_reduce($reports, function($sum, $r) { return $sum + $r[1]; }, 0); 

или

$total = array_sum(array_map(function($r) { return $r[1]; }, $reports); 

или

$total = 0; 
array_walk($reports, function($r) use (&$total) { $total += $r[1]; }); 
+0

Или 'array_reduce' – Barmar

+0

@Barmar: Добавлено так же :-) – Jon

+0

Достаточно хорошо для +1 :) – Barmar