Объедините два массива, суммируя перекрывающиеся результаты - PullRequest
3 голосов
/ 28 февраля 2011

Я пытаюсь объединить два массива, у которых есть несколько перекрывающихся результатов, и несколько, которые отличаются, как это:

array(
 [0] => array('name' => 'John', 'score' => '9');
 [1] => array('name' => 'Pete', 'score' => '2');
 [2] => array('name' => 'Eric', 'score' => '7');
)

и

array(
 [0] => array('name' => 'Lisa', 'score' => '1');
 [1] => array('name' => 'Pete', 'score' => '5');
 [2] => array('name' => 'Mary', 'score' => '4');
)

Это должно привести к одному массиву из пяти (не шести) результатов. Счет для Пита должен быть суммой двух его оценок, то есть «7».

Есть ли простая функция для этого, или я должен использовать один (или оба?) Списки и сверять их друг с другом? Я не уверен, с чего начать, указатель в правильном направлении был бы признателен!

редактирование:

Итак ... на самом деле оба массива заполнены объектами .. Есть какие-нибудь новые идеи?

Ответы [ 5 ]

2 голосов
/ 28 февраля 2011

Создайте временный массив поиска и воссоздайте из него ваш окончательный массив. Это алгоритм O (n), использующий дополнительное пространство. См. Здесь: http://codepad.org/4aL5KMR4

<?php

$arr1 =
array(
      array('name' => 'John', 'score' => '9'),
      array('name' => 'Pete', 'score' => '2'),
      array('name' => 'Eric', 'score' => '7'),
      );

$arr2=

array(
      array('name' => 'Lisa', 'score' => '1'),
      array('name' => 'Pete', 'score' => '5'),
      array('name' => 'Mary', 'score' => '4'),
      );

$res = array();
$revLookUp = array();
foreach($arr2 as $row)
{
  if(isset($revLookUp[$row['name']]) == true)
    $revLookUp[$row['name']] += $row['score'];
  else
    $revLookUp[$row['name']] = $row['score'];
}

foreach($arr1 as $row)
{
  if(isset($revLookUp[$row['name']]) == true)
    $revLookUp[$row['name']] += $row['score'];
  else
    $revLookUp[$row['name']] = $row['score'];
}


foreach($revLookUp as $key => $value){
  $res[] = array('name' => $key, 'score' => $value);
}

print_r($res);

?>
1 голос
/ 28 февраля 2011
function vector_sum($a, $b) {
  $arrays=func_get_args();
  $res=array(); $result=array();
  foreach($arrays as $current) {
    $res=array_reduce($current, function($res, cur){
      @$res[$cur['name']]+=$cur['score'];
      return $res;
    }, $res);
  }

  // sums done. put the result array in shape
  foreach ($res ad $name=>$score) 
    array_push($result, array('name'=>$name, 'score'=>$score));
  }
  return $result;
}

Не проверено, должно работать с произвольным числом массивов

1 голос
/ 28 февраля 2011

Нет функции для этой задачи из-за различий.Используйте этот алгоритм:

function merge($array1, $array2)
{
  $result = array();
  $count = (count($array1) > count($array2)) ? count($array1) : count($array2);
  for($i=0; $i<$count; $i++)
  {
    if($array1[$i]['name'] != $array2[$i]['name'])
    {
       $result[] = $array1[$i];
       $result[] = $array2[$i];
    }
    else
    {
       $array1['score'] += $array2['score'];
       $result[] = $array1[$i];
    }
  }
  return $result;
}

Извините за мой плохой английский.Удачи!

1 голос
/ 28 февраля 2011

Это сделает работу

$array1 = array(
      array('name' => 'John', 'score' => 9),
      array('name' => 'Pete', 'score' => 2),
      array('name' => 'Eric', 'score' => 7),
      );

$array2 = array(
      array('name' => 'Lisa', 'score' => 1),
      array('name' => 'Pete', 'score' => 5),
      array('name' => 'Mary', 'score' => 4),
      );

$result = array();
$names = array();

foreach ($array2 as $elem2){
    $cc = 0;
    foreach ($array1 as $key => $elem1){
        $cc++;
        if ($elem1['name'] == $elem2['name']) {
            $names[$elem1['name']] = $elem1['score'] + $elem2['score'];
            break;
        }
        else if ($cc == count($array1)) {
            array_push ($result, $elem2);
        }
    }
}

foreach ($array1 as $elem1){
    if ($names[$elem1['name']]){
        $elem1['score'] = $names[$elem1['name']];
    }
    array_push ($result, $elem1);
}
print_r($result);
0 голосов
/ 28 февраля 2011

если вы немного изменили дизайн массива следующим образом:

надеюсь, это поможет

<?php

$a = array(
 'John' => '9',
 'Pete' => '2',
 'Eric' => '7',
);

$b = array(
 'Lisa' => '1',
 'Pete' => '5',
 'Mary' => '4',
);


$newArray = $a;
foreach($b as $key => $value) {
    if(array_key_exists($key, $newArray)){
     $newArray[$key] += $value;
    }else{
     $newArray[$key] = $value;
    }
}


print_r($newArray);


?>

также вы можете просмотреть результат здесь: http://codepad.org/9hKF8oVC

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...