Сбой для array_merge (), тот же вывод до цикла - PullRequest
1 голос
/ 15 января 2020

Я видел множество связанных вопросов, но никто не ответил на это для меня - я извиняюсь, если это из-за моего недостатка знаний ...

У меня есть массив $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"
    }
  }

Но l oop не имеет никакого эффекта, по крайней мере, я не могу найти. Мой фактический вывод соответствует исходному массиву.

Что мне здесь не хватает?

EDIT / UPDATE: Простая путаница при передаче по ссылке / значению. Спасибо @Barmar за быстрое решение. Никаких изменений не было отражено в массиве, потому что я никогда не говорил php обновить эти значения. Шокирует, как это работает.

1 Ответ

2 голосов
/ 15 января 2020

Есть две причины, по которым ваш код не работает:

  1. Присвоение $contact не меняет массив, оно просто переназначает переменную.
  2. array_merge() не изменяет массив на месте, он возвращает новый массив.

Вы можете решить обе проблемы, сделав $contact ссылочной переменной.

foreach ($contacts as &$contact) {
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...