【问题标题】:How to merge arrays with same key and different value in PHP?如何在PHP中合并具有相同键和不同值的数组?
【发布时间】:2010-12-30 19:48:34
【问题描述】:

我有类似的数组:

0 => Array ( [0] => Finance / Shopping / Food, [1] => 47 )            
1 => Array ( [0] => Finance / Shopping / Food, [1] => 25 )                 
2 => Array ( [0] => Finance / Shopping / Electronic, [1] => 190 ) 

我需要创建一个数组,其中 [0] 为键,[1] 为值。
棘手的部分是,如果 [0] 相同,则将 [1] 添加到现有值。

所以我想要的结果是:

array ([Finance / Shopping / Food]=> 72, [Finance / Shopping / Electronic] => 190);

谢谢

【问题讨论】:

  • 看起来您应该使用键/值对而不是两个数组元素,一个是键,另一个是值。有没有理由你不能像这样首先构建数组? Array('Finance / Shopping / Food' => 47, 'Finance / Shopping / Food' => 25, 'Finance / Shopping / Electronic' => 190) 这将使您尝试做的其他事情变得更加简单.
  • 我什至不完全确定您的语法可以按原样工作。数组键可以是字符串或数值,但您的似乎是常量除以彼此和其他奇怪的东西。你可能想在这里阅读 php 数组:php.net/manual/en/language.types.array.php

标签: php arrays merge


【解决方案1】:
// array array_merge_values($base[, $merge[, ...]])
// Combines multiple array values based on key
//   (adding them together instead of the native array_merge using append)
//
// $base       - array to start off with
// $merge[...] - additional array(s) to include (and add their values) on to the base
function array_merge_values()
{
  $args = func_get_args();

  $result = $args[0];
  for ($_ = 1; $_ < count($args); $_++)
    foreach ($args[$_] as $key => $value)
    {
      if (array_key_exists($key,$result))
        $result[$key] += $value;
      else
        $result[$key] = $value;
    }
  return $result;
}

$array1 = Array('foo' => 5, 'bar' => 10, 'foobar' => 15);
$array2 = Array('foo' => 20,                             'foohbah' => 25);
$array3 = Array(            'bar' => 30);
var_dump(array_merge_values($array1,$array2,$array3));

结果:

array(4) {
  ["foo"]=>
  int(25)
  ["bar"]=>
  int(40)
  ["foobar"]=>
  int(15)
  ["foohbah"]=>
  int(25)
} 

这就是你要找的东西?

【讨论】:

    【解决方案2】:

    这应该可行:

    $outArray = array()
    foreach($superArray as $subArray) {
      if(array_key_exists($outArray,$subArray[0])) { 
        $outArray[$subArray[0]] += $subArray[1]; 
      } else { 
        $outArray[$subArray[0]] = $subArray[1]; 
      }
    }
    

    【讨论】:

    • 事实上,它可能在没有 if/else 的情况下工作,只需使用 $outArray[$subArray[0]] += $subArray[1] 循环整个事情。
    • 它会起作用,但对未初始化的值执行 += 不是一个好主意(尽管我认为在这种情况下它是微不足道的,假设 0 是“基础”值。)
    • @Brad 我的想法完全正确。我的回答更正确,但 PHP 相当灵活/脏,允许注释中的代码 :-)
    【解决方案3】:

    好吧,我不知道该数组有多大,也不知道性能是什么因素。但这是非常具体的,我敢于推荐天真的直接程序方法:

    <?
    $result = array();
    foreach($arr as $a) {
       $result[$a[0]] += $result[$a[1]];
    }
    ?>
    

    这会产生一些 php 警告,因为该字段尚未设置,因此您可能需要执行检查键是否存在,如果不存在则设置值,如果存在,添加值...

    编辑:好吧,让我们发布这个,这可能看起来像

    <?
    $result = array();
    foreach($arr as $a) {
       if(isset($result[$a[0]])) {
           $result[$a[0]] += $result[$a[1]];
       } else {
           $result[$a[0]] = $result[$a[1]];
       }
    }
    ?>
    

    【讨论】:

      【解决方案4】:

      您可以使用“+”操作数。

      $arr1 = array(
        'key' => '1',
      );
      $arr2 = array(
        'key' => '2',
      );
      die(var_dump($arr2 + $arr1));
      
      RESULT:
      array
        'key' => string '2' (length=1)
      

      【讨论】:

        猜你喜欢
        • 2014-03-12
        • 1970-01-01
        • 1970-01-01
        • 2015-01-04
        • 2016-12-29
        • 1970-01-01
        • 1970-01-01
        • 2018-02-22
        • 1970-01-01
        相关资源
        最近更新 更多