【问题标题】:Array Modification by same values数组修改相同的值
【发布时间】:2012-07-28 08:48:16
【问题描述】:

我有如下二维数组..

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

如何得到这个数组?

【问题讨论】:

  • 不需要 (int) 强制转换,并且由于您的数组是基于零索引的 - 不需要使用 X => Y 语法。如果您删除这些,代码将更具可读性并且可能会吸引答案。

标签: php arrays multidimensional-array cakephp-2.1


【解决方案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);
}

【讨论】:

    【解决方案2】:

    我会遍历数组并将所有内容放入一个新的(临时)关联数组中。 在那个临时数组中,我将使用(标识)名称作为键,使用附加信息作为值。 这样你就没有重复了。

    在您的迭代过程中,您可以调用 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;
        }
    
    }
    

    【讨论】:

      【解决方案3】:

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

      这可以很好地完成,例如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)(你只需要迭代两次)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-22
        • 1970-01-01
        • 2019-06-11
        • 1970-01-01
        • 2014-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多