Передача массива php по ссылке - присвоение дублированного значения для ключа отбрасывается - PullRequest
0 голосов
/ 16 августа 2010

Я отправляю ссылку на переменную массива, которая изначально пуста. В вызываемой функции массив заполняется.

function one()
{
     $ret = array();
     two($ret);

      pri nt_r($ret);
}

function two(&$res)
{
     foreach($a as $b)
     {
       $id = $b->getid();
       $txt = $b->gettxt();

       $res[$id] = $txt;
      }
}

Здесь, если $ id дублирован, я предполагаю, что он по умолчанию перезаписан. То есть, если foreach запускается 5 раз и три раза, если id = 5, то результатом будет только два элемента в массиве;

Это поведение по умолчанию для такого типа присвоения массивов? или я что-то упустил?


Да, дубликаты записываются с последними значениями. Я тестировал отдельно, и это оказалось так, как предполагалось. Но если мы используем array_push, я надеюсь, что он будет дублирован. Я думал, что прямое назначение дубликатов будет дублироваться вместо перезаписи. В любом случае позвольте мне получить некоторые комментарии от пользователей, чтобы я мог обновить, если мне не хватает полезной информации об этом дублировании и перезаписи.

Ответы [ 2 ]

2 голосов
/ 16 августа 2010

Из Руководства PHP по массивам:

Массив в PHP на самом деле является упорядоченной картой. Карта - это тип, который связывает значения с ключами. Этот тип оптимизирован для нескольких различных применений; его можно рассматривать как массив, список (вектор), хеш-таблицу (реализацию карты), словарь, коллекцию, стек, очередь и, возможно, больше. Поскольку значениями массива могут быть другие массивы, деревья и многомерные массивы также возможны.

Далее

Ключ может быть целым числом или строкой. Если ключ является стандартным представлением целого числа, оно будет интерпретировано как таковое (то есть «8» будет интерпретировано как 8, а «08» будет интерпретировано как «08»)

И самое главное для вашего вопроса

Если ключ не указан для значения, берется максимум целочисленных индексов, и новым ключом будет это значение плюс 1. Если указан ключ, который уже имеет назначенное значение, это значение будет перезаписано.

1 голос
/ 16 августа 2010

Я не понимаю, почему вы говорите о массивах по ссылке или что такое $ a в вашем примере, но простой ответ - да, они перезаписаны.

$a = array();
$b = 'someText'; // or $b = 25;
$a[$b] = 1;
$a[$b] = 2;

Тогда $ a [$ b] будет равно 2, независимо от того, чем является $ b и откуда берется $ a.

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