3

私はこのような配列を持っています、

array(
  [0]=>111 //id
  [1]=>5   //value to ad
  [2]=>3   //value to ad
)
array(
  [0]=>111
  [1]=>3
  [2]=>7   
)
array(
  [0]=>111
  [1]=>2
  [2]=>1   
)
array(
  [0]=>222
  [1]=>5
  [2]=>3   
)

結果が「id」ごとに1回表示されるようにこれらの配列をフィルタリングし、同じ「id」を持つ場合は「追加する値」を追加するにはどうすればよいですか。したがって、結果は次のようになります。

array(
  [111]=>array(
          [0]=>10
          [1]=>11
         )
  [222]=>array(
          [0]=>5
          [1]=>3
         )
)

回答と提案は大歓迎です!

4

3 に答える 3

2

ループを使用して手動でこれを行う必要があります。このようなものが動作するはずです:

$result = array();

foreach( $input as $row) {
    $id = array_shift( $row);

    foreach( $row as $key => $value) {

        $result[ $id ][ $key ] = 
            ( isset( $result[ $id ][ $key ]) ? 
                  $result[ $id ][ $key ] + $value : 
                  $value
            );
    }
}

出力:

array(2) {
  [111]=>
  array(2) {
    [0]=>
    int(10)
    [1]=>
    int(11)
  }
  [222]=>
  array(2) {
    [0]=>
    int(5)
    [1]=>
    int(3)
  }
}

デモ

于 2012-06-13T00:45:38.303 に答える
1

複雑にしないでおく

foreach ($arrays as $array) {

    $final[$array[0]] = array(
        @$final[$array[0]][0] + $array[1],
        @$final[$array[0]][1] + $array[2]
    );
}

http://codepad.org/lCCXHjKR

于 2012-06-13T01:03:26.863 に答える
0

コード

// This is your input.
$Input[] = array(
  0=>111, //id
  1=>5,   //value to ad
  2=>3   //value to ad
);
$Input[] = array(
  0=>111,
  1=>3,
  2=>7   
);
$Input[] = array(
  0=>111,
  1=>2,
  2=>1   
);
$Input[] = array(
  0=>222,
  1=>5,
  2=>3   
);

// This is your output.
$Output = array();
for($i=0; $i<count($Input); $i++)
{
    $id = $Input[$i][0];

    // If key already exists...
    if(array_key_exists($id, $Output))
    {
        // Sum it.
        $Output[$id][0] += $Input[$i][1];
        $Output[$id][1] += $Input[$i][2];
    }
    // If not...
    else
    {
        // Initialize it.
        $Output[$id][0] = $Input[$i][1];
        $Output[$id][1] = $Input[$i][2];
    }
}

// This is your output dumped.
print_r($Output);

出力

Array
(
    [111] => Array
        (
            [0] => 10
            [1] => 11
        )

    [222] => Array
        (
            [0] => 5
            [1] => 3
        )

)

追記事項

重要なのは、array_key_existsを使用して、インデックスが配列に既に存在するかどうかを確認することです。

于 2012-06-13T00:55:06.417 に答える