未能 array_merge(),循环之前的相同输出
Failing to array_merge(), same output prior to loop
我看过很多相关问题,none 为我回答了这个问题 - 如果这是因为我缺乏知识,我深表歉意...
我有一个数组,$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++;
}
我的 expected/desired 输出将是:
[{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"
}
}
但是循环没有任何效果,至少我找不到。我的实际输出与初始数组匹配。
我在这里错过了什么?
EDIT/UPDATE:经过 reference/value 时简单混淆。感谢@Barmar 的快速解决方案。数组中没有反映任何更改,因为我实际上从未告诉 php 更新这些值。令人震惊的工作原理。
您的代码不起作用的原因有两个:
- 分配给
$contact
不会更改数组,它只是重新分配变量。
array_merge()
不会就地修改数组,它 returns 一个新数组。
您可以通过将 $contact
设为参考变量来解决这两个问题。
foreach ($contacts as &$contact) {
...
}
我看过很多相关问题,none 为我回答了这个问题 - 如果这是因为我缺乏知识,我深表歉意...
我有一个数组,$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++;
}
我的 expected/desired 输出将是:
[{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"
}
}
但是循环没有任何效果,至少我找不到。我的实际输出与初始数组匹配。
我在这里错过了什么?
EDIT/UPDATE:经过 reference/value 时简单混淆。感谢@Barmar 的快速解决方案。数组中没有反映任何更改,因为我实际上从未告诉 php 更新这些值。令人震惊的工作原理。
您的代码不起作用的原因有两个:
- 分配给
$contact
不会更改数组,它只是重新分配变量。 array_merge()
不会就地修改数组,它 returns 一个新数组。
您可以通过将 $contact
设为参考变量来解决这两个问题。
foreach ($contacts as &$contact) {
...
}