0

私は次のような2次元配列を持っています。

array(
0 => array(
    0 => 'India',
    1 => '91'
),
1 => array(
    0 => 'Australia',
    1 => '1'
),
2 => array(
    0 => 'India',
    1 => '20'
),
3 => array(
    0 => 'Iraq',
    1 => '10'
),
4 => array(
    0 => 'Australia',
    1 => '3'
),
    5 => array(
    0 => 'Kuweit',
    1 => '14'
)
)

同じ内部配列値が存在する場合はそれを取得してマージし、追加する必要があります。したがって、その配列を次の配列に入れたいと思います。

  array(
 0 => array(
   0 => 'India',
   1 => 111
 ),
 1 => array(
   0 => 'Australia',
   1 => 4
 ),
 2 => array(
   0 => 'Iraq',
   1 => 10
 ),
 3 => array(
   0 => 'Kuweit',
   1 => 14
 )
)

この配列を取得する方法は?

4

3 に答える 3

1

配列を繰り返し処理し、すべてを新しい(一時的な)連想配列に入れます。その一時配列では、(識別)名をキーとして使用し、追加情報を値として使用します。そうすれば、重複はまったくありません。

反復中に、array_key_existsを呼び出して、名前が一時配列で既に認識されているかどうかを判断できます。認識されている場合は、両方の数値の合計を一時配列に格納できます。

(検証されていません。最初の配列が$ inputArrayに格納されている場合)

<?php

$mergedArray = array();

foreach($inputArray as $child) {

    list($key, $value) = $child;

    if(array_key_exists($key, $mergedArray) {
        $mergedArray[$key] += $child;
    } else {
        $mergedArray[$key] = $child;
    }

}
于 2012-07-28T09:53:34.473 に答える
1

配列を反復処理し、連想配列に変換してから(国名をキーとして使用)、数値インデックス付き配列に変換し直します。

array_reduceこれは、egとforeach:を使用してうまく行うことができます。

$array = array(...);
$array = array_reduce($array, function(&$result, $item) {
    @$result[$item[0]] += $item[1]; // $result[$item[0]] might not exist, suppress error and auto-init to zero.
    // cleaner (less hackish) code: if(!isset($result[$item[0]])) $result[$item[0]] = 0;
  }, array());
// and transform back:
$newarray = array();
foreach($array as $k => $v) {
  $newarray[] = array($k, $v);
}

実行時の複雑さはO(n)である必要があります(2回だけ反復します)

于 2012-07-28T10:07:41.420 に答える
1

knittlの答えはもっと簡潔ですが、次のような同じ戦略に従うことができます。

// $in = source array in your question ... 

/* collect the totals */
$collect = array();
foreach ($in as $item)
{
    if (array_key_exists($item[0], $collect))
    {
        $collect[$item[0]] += $item[1];
    }
    else
    {
        $collect[$item[0]] = (int) $item[1];
    }
}

/* repackage the result */
$out = array();
foreach ($collect as $key => $value)
{
    $out[] = array($key, $value);
}
于 2012-07-28T10:43:52.667 に答える