Как объединить массивы с одинаковым ключом и разными значениями в PHP? - PullRequest
2 голосов
/ 30 декабря 2010

У меня есть массивы, подобные этим:

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

спасибо

Ответы [ 4 ]

2 голосов
/ 30 декабря 2010
// 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)
} 

Это то, что вы ищете?

1 голос
/ 30 декабря 2010

Это должно работать:

$outArray = array()
foreach($superArray as $subArray) {
  if(array_key_exists($outArray,$subArray[0])) { 
    $outArray[$subArray[0]] += $subArray[1]; 
  } else { 
    $outArray[$subArray[0]] = $subArray[1]; 
  }
}
0 голосов
/ 06 февраля 2013

Вы можете использовать операнд "+" для этой цели.

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

RESULT:
array
  'key' => string '2' (length=1)
0 голосов
/ 30 декабря 2010

Ну, я не знаю, насколько велик этот массив или каков фактор производительности.Но это очень специфично, и я осмелюсь рекомендовать наивный прямой процедурный подход:

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

это вызовет некоторое php-предупреждение, потому что поле еще не установлено, поэтому вам, вероятно, нужно сделать что-то вроде проверкиключ существует, и если не установить его значение, и, если оно есть, добавить значение ...

edit: хорошо, давайте опубликуем это, это может выглядеть как

<?
$result = array();
foreach($arr as $a) {
   if(isset($result[$a[0]])) {
       $result[$a[0]] += $result[$a[1]];
   } else {
       $result[$a[0]] = $result[$a[1]];
   }
}
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...