2

これに関してどの機能を検索すればよいかわからないので、自分自身を助けることができないようです。本当に明らかな問題のようです。配列があり、キーが重複している場合は、値を追加したいと思います。例えば:

これは私の配列のセクションです。

[1] => Array
    (
        [inputAvg] => 21.41 KB
        [outputAvg] => 22.03 KB
        [date] => 2011-08-01
    )

[2] => Array
    (
        [inputAvg] => 182.63 KB
        [outputAvg] => 186.05 KB
        [date] => 2011-08-01
    )

[3] => Array
    (
        [inputAvg] => 182.63 KB
        [outputAvg] => 186.05 KB
        [date] => 2011-08-02
    )

[4] => Array
    (
        [inputAvg] => 4.84 MB
        [outputAvg] => 4.93 MB
        [date] => 2011-08-03
    )

私がやりたいのは、配列の日付キーが同じ場所であると言うことです(たとえば、ここ2011-08-01)この日付を一度表示したいのですが、重複するアイテムの値を組み合わせて...?

例えば

[1] => Array
    (
        [inputAvg] => 204.04 KB
        [outputAvg] => 208.08 KB
        [date] => 2011-08-01
    )


[2] => Array
    (
        [inputAvg] => 182.63 KB
        [outputAvg] => 186.05 KB
        [date] => 2011-08-02
    )

[3] => Array
    (
        [inputAvg] => 4.84 MB
        [outputAvg] => 4.93 MB
        [date] => 2011-08-03
    )
4

4 に答える 4

13
<?php

$array  = array(Array("inputAvg" => 21.41,"outputAvg" => 22.03,"date" => "2011-08-01"),
                Array("inputAvg" => 182.63,"outputAvg" => 186.05,"date" => "2011-08-01" ),
                Array("inputAvg" => 182.63, "outputAvg" => 186.05,"date" => "2011-08-02")
                );

$res  = array();
foreach($array as $vals){
    if(array_key_exists($vals['date'],$res)){
        $res[$vals['date']]['inputAvg']    += $vals['inputAvg'];
        $res[$vals['date']]['outputAvg']   += $vals['outputAvg'];
        $res[$vals['date']]['date']        = $vals['date'];
    }
    else{
        $res[$vals['date']]  = $vals;
    }
}

echo "<pre>";
print_r($res);

?>

出力:

Array
(
    [2011-08-01] => Array
        (
            [inputAvg] => 204.04
            [outputAvg] => 208.08
            [date] => 2011-08-01
        )

    [2011-08-02] => Array
        (
            [inputAvg] => 182.63
            [outputAvg] => 186.05
            [date] => 2011-08-02
        )

)
于 2013-02-19T13:01:11.380 に答える
1

$data に、処理したいすべてのデータがあるとします。

$dateArray = array();
foreach($data as $key => $value){
    if(in_array($value['date'], $dateArray)){
        $newArray[$value['date']]['inputAvg'] = $value['inputAvg'] + $newArray[$value['date']]['inputAvg'];
        $newArray[$value['date']]['outputAvg'] = $value['outputAvg'] + $newArray[$value['date']]['outputAvg'];
    }
    else{
        $dateArray[] = $value['date'];
        $newArray[$value['date']] = $value;
    }
}

ただし、その追加は平均を追加するだけであり、最終的に KB/MB を表示しないことに注意してください。あなたはそれを操作する必要があります。

于 2013-02-19T13:09:51.750 に答える
0

これを試してください。

$new = array() ;

foreach ($stats as $traffic){
  $key = $traffic['date'] ;

  if (isset($new[$key])){
    if ($new[$key]['date'] === $traffic['date']){
      $new[$key]['inputAvg'] += $traffic['inputAvg'] ;
      $new[$key]['outputAvg'] += $traffic['outputAvg'] ;
    }
  } else {
    $new[$key] = $traffic ;
  }
}

var_dump($new) ;

TYPO を編集したので、動作するようになりました。

于 2013-02-19T12:59:24.147 に答える
0

これは、KB、MB、および GB を考慮したソリューションです。

KB、MB、GBから絶対値を取得する関数

function mul($unit) {
  $mul = 1;
  switch($unit) {
    case 'GB': $mul *= 1000;
    case 'MB': $mul *= 1000;
    case 'KB': $mul *= 1000;
  }
  return $mul;
}

G、M、または K で割った数値から文字列を作成し、接尾辞を追加する関数

function demul($val) {
  $units = array('GB','MB','KB');
  $unit = '  ';
  $m = 1000000000;
  for ($i=0 ; $i<3 ; $i++) {
    if ($val >= $m) {
      $val /= $m;
      $unit = $units[$i];
      break;
    }
    $m /= 1000;
  }
  return number_format($val, 2) . ' ' . $unit;
}

メイン ループ$arrは元の配列です。dates合計データで配列を埋める

$dates = array();
foreach ($arr as $key => $a) {
  $d = $a['date'];
  $i = explode(' ', $a['inputAvg']);
  $o = explode(' ', $a['outputAvg']);
  $in  = $i[0] * mul($i[1]);
  $out = $o[0] * mul($o[1]);

  if ( ! isset($dates[$d])) {
    $dates[$d] = array($in, $out);
  }
  else {
    $dates[$d][0] += $in;
    $dates[$d][1] += $out;
  }
}

resultの形式に基づいて配列を作成する

$result = array();
$n = 1;
foreach ($dates as $d => $a) {
  $result[$n++] = array('date' => $d, 'inputAvg' => demul($a[0]), 'outputAvg' => demul($a[1]));
}

印刷結果

print_r($result);

データを考えると

$arr = array(
'1' => Array
    (
        'inputAvg' => '21.41 KB',
        'outputAvg' => '22.03 KB',
        'date' => '2011-08-01',
    ),

'2' => Array
    (
        'inputAvg' => '182.63 KB',
        'outputAvg' => '186.05 KB',
        'date' => '2011-08-01',
    ),

'3' => Array
    (
        'inputAvg' => '182.63 KB',
        'outputAvg' => '186.05 KB',
        'date' => '2011-08-02',
    ),

'4' => Array
    (
        'inputAvg' => '4.84 MB',
        'outputAvg' => '4.93 MB',
        'date' => '2011-08-03',
    )
);

それは出力を与える

Array
(
    [1] => Array
        (
            [date] => 2011-08-01
            [inputAvg] => 204.04 KB
            [outputAvg] => 208.08 KB
        )

    [2] => Array
        (
            [date] => 2011-08-02
            [inputAvg] => 182.63 KB
            [outputAvg] => 186.05 KB
        )

    [3] => Array
        (
            [date] => 2011-08-03
            [inputAvg] => 4.84 MB
            [outputAvg] => 4.93 MB
        )

)
于 2013-02-19T13:20:22.877 に答える