平均数组中的特定值

时间:2011-12-07 18:42:33

标签: php arrays

我有一个如下所示的数组:

PHP Syntax (Toggle Plain Text)
    array
      0 => 
        array
          0 => string '12/08/2011' (length=10)
          1 => string '00:00' (length=5)
          2 => string '34.83' (length=5)
          3 => string '12/08/2011' (length=10)
          4 => string '00:00' (length=5)
          5 => string '34.83' (length=5)
      1 => 
        array
          0 => string '12/08/2011' (length=10)
          1 => string '01:00' (length=5)
          2 => string '32.07' (length=5)
          3 => string '12/08/2011' (length=10)
          4 => string '01:00' (length=5)
          5 => string '32.07' (length=5)
      2 => 
        array
          0 => string '12/08/2011' (length=10)
          1 => string '02:00' (length=5)
          2 => string '28.69' (length=5)
          3 => string '12/08/2011' (length=10)
          4 => string '02:00' (length=5)
          5 => string '28.69' (length=5)
      3 => 
        array
          0 => string '12/08/2011' (length=10)
          1 => string '03:00' (length=5)
          2 => string '28.17' (length=5)
          3 => string '12/08/2011' (length=10)
          4 => string '03:00' (length=5)
          5 => string '28.17' (length=5)

我要做的是将每个2/5元素相互平均为>带有日期/时间的新数组。有类似的东西

array
0 => 
array
0 => string '12/08/2011' (length=10)
1 => string '00:00' (length=5)
2 => string 'AVERAGE OF 2&5' (length=5)
PHP Syntax (Toggle Plain Text)
      1 => 
        array
          0 => string '12/08/2011' (length=10)
          1 => string '01:00' (length=5)
          2 => string 'AVERAGE OF 2&5' (length=5)
      2 => 
        array
          0 => string '12/08/2011' (length=10)
          1 => string '02:00' (length=5)
          2 => string 'AVERAGE OF 2&5' (length=5)
      3 => 
        array
          0 => string '12/08/2011' (length=10)
          1 => string '03:00' (length=5)
          2 => string 'AVERAGE OF 2&5' (length=5)

任何帮助都会受到赞赏,我一直在努力解决这个问题几个小时现在无法实现这个目标吗? ...我是否需要将元素分解为自己的数组,然后重新插入?

谢谢。

2 个答案:

答案 0 :(得分:2)

如果你有php5.3 +你可以使用带有array_map的闭包在两行中(如果你喜欢难以读取函数调用那么一行):

$f = function($x) { return array($x[0], $x[1], ($x[2]+$x[5])/2); };
$new = array_map($f, $arr);
print_r($new);

闭包返回一个新数组,其中包含您请求的两个值,并平均键2和5的值。


如果您没有PHP5.3,请使用常规功能:

function dan_is_awesome($x) { return array($x[0], $x[1], ($x[2]+$x[5])/2); };
$new = array_map('dan_is_awesome', $arr);
print_r($new);

array_map()将第一个参数作为回调函数,然后它对输入数组的每个元素执行。


<强>更新

Stack Overflow 不是可以替代逻辑思维。 “你能为我做这件事吗”不是一个合理的问题。但是......

如果您需要满足以下评论中列出的要求(平均键2/5/7/10/12/15 ......等等到阵列末尾),您可以这样做:

function dan_is_awesome($x)
{
  $avg_vals = array($x[2], $x[5]);

  $i = 10;
  while ($i < count($x)) {
    if ($i % 10 == 0     // divisible by 10
      || $i-5 % 10 == 0  // divisible by 5
      || $i % 2 == 0     // divisible by 2
    ) { 
      $avg_vals[] = $x[$i];
    }
    ++$i;
  }

  $avg = array_sum($avg_vals) / count($avg_vals);

  return array($x[0], $x[1], $avg);
};

$new = array_map('dan_is_awesome', $arr);
print_r($new);

答案 1 :(得分:0)

我更喜欢rdlowrey的方法,但对大多数人来说这可能更容易理解。

foreach ($arr as $key => $subArray) {
    $ave = ($subArray[2] + $subArray[5]) / 2;
    $arr[$key] = array($subArray[0], $subArray[1], $ave);
}