数组修改相同的值

时间:2012-07-28 08:48:16

标签: php arrays multidimensional-array cakephp-2.1

我有以下二维数组如下..

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
 )
)

如何获得此阵列?

3 个答案:

答案 0 :(得分: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;
    }

}

答案 1 :(得分:1)

迭代数组,将其转换为关联数组(使用国家/地区名称作为键),然后将其转换回数字索引数组。

这可以很好地完成,例如array_reduceforeach

$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 :(得分:1)

knott的答案更简洁,但您可以遵循相同的策略:

// $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);
}