我有以下二维数组如下..
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
)
)
如何获得此阵列?
答案 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_reduce
和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 :(得分: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);
}