2014-12-29 91 views
1

这可能对你们中的一些人很简单,但我真的在PHP中是虚拟的。我所需要的只是转换一个多维数组并计算它的一些子数组值。PHP:按阵列计算数组值

Array 
    (
     [0] => Array 
      (
       [date] => 2014-10-30 
       [mission] => one 
       [point] => 10 
      ) 

     [1] => Array 
      (
       [date] => 2014-10-31 
       [mission] => five 
       [point] => 10 
      ) 

     [2] => Array 
      (
       [date] => 2014-11-19 
       [mission] => one 
       [point] => 8 
      ) 

和输出会是这样:

Array 
(
    [one] => Array 
     (
      [mission] => one 
      [point] => 18 // sum all points where [mission] => one 
      [count] => 2 
      [everage] => 9 // 18/2 
     ) 

    [five] => Array 
     (
      [mission] => five 
      [point] => 10 
      [count] => 1 
      [everage] => 10 
     ) 

它是简单的获得使用foreach[point]值的总和,但麻烦开始的时候我试图让与同一[mission]值阵列count。这就是我的代码:

foreach($missionsarray as $row) { 
    if(!isset($newarray[ $row['mission'] ])) { 
     $newarray[ $row['mission'] ] = $row; 
     $newarray[ $row['mission'] ]['count'] = count($row['point']); 
     continue ; 
    } 
    $newarray[ $row['mission'] ]['point'] += $row['point']; 
} 

print_r($newarray); 

回答

2

count()的参数应该是一个数组,它返回该数组中的元素数。这不是你想要的。当您首次在任务结果中创建新条目时,应将count设置为1。然后你每增加一个point就可以增加它。

foreach($missionsarray as $row) { 
    if(!isset($newarray[ $row['mission'] ])) { 
     $newarray[ $row['mission'] ] = $row; 
     $newarray[ $row['mission'] ]['count'] = 1; 
     continue ; 
    } 
    $newarray[ $row['mission'] ]['point'] += $row['point']; 
    $newarray[ $row['mission'] ]['count']++; 
} 

print_r($newarray); 
0

使用此

$newarray[ $row['mission'] ]['point'] += $row['point']; 
$newarray[ $row['mission'] ]['count']++; 

print_r($newarray); 

更新PHP 5.5

array_column()

$counts = array_count_values(array_flip(array_column($array, 'point'))); 
0

首先,我觉得这条线给你添麻烦:

$newarray[ $row['mission'] ]['count'] = count($row['point']); 

你应该设置初始计数为0,因为你见过没有记录至今:

$newarray[ $row['mission'] ]['count'] = 0; 

之后你这样做,每次你看到同样的使命再创纪录,你可以添加一个这样的计数:

$newarray[ $row['mission'] ]['point'] += $row['point']; 
$newarray[ $row['mission'] ]['count']++; 

之后,你应该很好地计算平均值。

0

我认为你正在试图做的是以下几点:

foreach ($missionsarray as $row) { 
    $mission = $row['mission']; 
    $point = $row['point']; 

    if (! isset($newarray[$mission])) { 
     $newarray[$mission] = [ 
      'mission' => $mission, 
      'point' => 0, 
      'count' => 0, 
      'average' => 0 
     ]; 
    } 

    $newarray[$mission]['point'] += $point; 
    $newarray[$mission]['count']++; 

    $newarray[$mission]['average'] = 
     $newarray[$mission]['point']/$newarray[$mission]['count']; 
} 
0

我认为这可能是更容易for循环,如下解决这个问题:

<?php 

$arr = array(0 => array("date" => "2014-10-30","mission" => "one","point" => 10), 
      1 => array("date" => "2014-10-31","mission" => "five","point" => 10), 
      2 => array("date" => "2014-11-19","mission" => "one","point" => 8) 
      ); 

$ototal = 0; // total mission one points 
$ftotal = 0; // total mission five points 

$ocount = 0; // count for mission one 
$fcount = 0; // count for mission five 

for ($i=0, $max = count($arr); $i < $max; $i++){ 
    if ($arr[$i]["mission"] == "one"){ 
     $ototal += $arr[$i]["point"]; 
     $ocount++; 

    } 
    else 
    if ($arr[$i]["mission"] == "five"){ 
     $ftotal += $arr[$i]["point"]; 
     $fcount++; 
    } 
} 

// transform $arr by adding the following elements: 
$arr["one"] = array("mission" => "one", "point" => $ototal, "count" => $ocount, "average" => $ototal/ $ocount); 
$arr["five"]= array("mission" => "five","point" => $ftotal, "count" => $fcount, "average" => $ftotal/$fcount); 

var_dump($arr["one"],$arr["five"]); 

现场演示here