Php 未能数组_merge(),循环前的相同输出

Php 未能数组_merge(),循环前的相同输出,php,arrays,array-merge,Php,Arrays,Array Merge,我看过很多相关的问题,没有一个能为我解答-如果这是因为我缺乏知识,我道歉 我有一个数组,$contacts,其中每个记录如下所示,有1个或多个联系人: [{internal_id}]=> array(3) { [0]=> array(6) { ["name"]=> string(13) "matching name" ["bphone"]=> string(13) "(123)345-5678"

我看过很多相关的问题,没有一个能为我解答-如果这是因为我缺乏知识,我道歉

我有一个数组,
$contacts
,其中每个记录如下所示,有1个或多个联系人:

[{internal_id}]=>
  array(3) {
    [0]=>
    array(6) {
      ["name"]=>
      string(13) "matching name"
      ["bphone"]=>
      string(13) "(123)345-5678"
      ["cphone"]=>
      string(13) "(321)345-6857"
      ["hphone"]=>
      string(13) "(123)543-5790"
      ["email"]=>
      string(0) ""
      ["email2"]=>
      string(0) ""
    }
    [1]=>
    array(6) {
      ["name"]=>
      string(13) "matching name"
      ["bphone"]=>
      string(13) "(123)345-5678"
      ["cphone"]=>
      string(0) ""
      ["hphone"]=>
      string(0) ""
      ["email"]=>
      string(20) "margethis@please.com"
      ["email2"]=>
      string(21) "mergethis2@please.com"
    }
    [2]=>
    array(6) {
      ["name"]=>
      string(17) "not matching name"
      ["bphone"]=>
      string(13) "(123)987-6453"
      ["cphone"]=>
      string(13) "(321)789-3546"
      ["hphone"]=>
      string(0) ""
      ["email"]=>
      string(21) "email@popularmail.com"
      ["email2"]=>
      string(22) "email2@popularmail.com"
    }
  }
我想结合任何类似的名字,每个记录,保持相关的联系信息。试一试:

    $i = 1; //1 > 0 so no need to +1 each time it's used in this case
    foreach($contacts as $contact){
        if($contact['name'] == $contacts[$i]['name']){
            $contact = array_merge($contact, $contacts[$i]);
            unset($contacts[$i]);
        }
        $i++;
    }
我的预期/期望输出为:

[{internal_id}]=>
  array(2) {
    [0]=>
    array(6) {
      ["name"]=>
      string(13) "matching name"
      ["bphone"]=>
      string(13) "(123)345-5678"
      ["cphone"]=>
      string(13) "(321)345-6857"
      ["hphone"]=>
      string(13) "(123)543-5790"
      ["email"]=>
      string(20) "margethis@please.com"
      ["email2"]=>
      string(21) "mergethis2@please.com"
    }
    [1]=>
    array(6) {
      ["name"]=>
      string(17) "not matching name"
      ["bphone"]=>
      string(13) "(123)987-6453"
      ["cphone"]=>
      string(13) "(321)789-3546"
      ["hphone"]=>
      string(0) ""
      ["email"]=>
      string(21) "email@popularmail.com"
      ["email2"]=>
      string(22) "email2@popularmail.com"
    }
  }
但是循环没有任何效果,至少我找不到。我的实际输出与初始数组匹配

我错过了什么


编辑/更新:通过引用/值传递时的简单混淆。感谢@Barmar提供的快速解决方案。数组中没有反映任何更改,因为我从未实际告诉php更新这些值。令人震惊的工作原理。

您的代码无法工作有两个原因:

  • 分配给
    $contact
    不会改变数组,它只是重新分配变量
  • array\u merge()
  • 您可以通过将
    $contact
    设置为参考变量来解决这两个问题

    foreach ($contacts as &$contact) {
        ...
    }
    

    我想我以前已经说过了,但是谢谢你在这里用php给出的所有答案。经常看到你的回答。一旦你指出它,它看起来很明显……它是按值调用,而不是按
    &
    引用调用。