Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 合并两个数组,将重叠的结果相加_Php_Arrays_Merge - Fatal编程技术网

Php 合并两个数组,将重叠的结果相加

Php 合并两个数组,将重叠的结果相加,php,arrays,merge,Php,Arrays,Merge,我正在尝试合并两个数组,它们的结果有些重叠,有些不同,如下所示: array( [0] => array('name' => 'John', 'score' => '9'); [1] => array('name' => 'Pete', 'score' => '2'); [2] => array('name' => 'Eric', 'score' => '7'); ) 及 这将产生一个包含五个(而不是六个)结果的数组。皮特的分数应该是

我正在尝试合并两个数组,它们的结果有些重叠,有些不同,如下所示:

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

这将产生一个包含五个(而不是六个)结果的数组。皮特的分数应该是他两个分数的总和,即“7”

有没有一个简单的函数可以实现这一点,或者我必须为每个列表(或者两者)设置一个并相互检查它们?我不知道如何开始这一点,一个指向正确方向的指针将不胜感激

编辑: 所以。。实际上,两个数组都填充了对象。。有什么新想法吗?

这就行了

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

由于不同,此任务没有函数。使用此算法:

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;
}
函数合并($array1,$array2)
{
$result=array();
$count=(count($array1)>count($array2))?count($array1):count($array2);

对于($i=0;$i),如果您稍微按照以下方式重新设计阵列:

希望能有帮助

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


?>

您也可以在此处查看结果:


未测试,它应与任意数组号一起使用创建临时查找数组并从中重新创建最终数组。这是一个使用额外空间的O(n)算法。请参见此处:



在合并过程中使用mergesort并检查是否与前面的元素相等。原因如下:格式错误、答案不完整(他要求合并)以及性能不理想optimal@Chimoo:我的电脑已挂起,我的电脑已编辑(但尚未完成)帖子已提交,请再等一分钟,我的帖子将在foreach准备就绪。由于某种原因,$array1和$array2实际上变成了对象。不得不对整个事情进行一点修改-这将适用于所有情况谢谢你的回答!我不认为它完全符合我的要求,因为它似乎没有增加分数s?不管怎样,我有了一个方法,这就是我所需要的。重新设计使它变得琐碎。也许这不是他想要的。是的,你是对的,我同意,但这只会使事情对他来说更容易,无需重复两次……这个问题与Thariama的答案相同……它将数组同时转换为对象foreach@stephan谢谢指点我们可以用for循环遍历它
<?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);


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

?>