PHP array_merge - как это работает? - PullRequest
0 голосов
/ 03 января 2012

Вчера у меня был головной убор.

По сути, у меня был ассоциативный массив некоторых данных со строковыми ключами (содержащий числовые значения, но все же строки в кавычках), которые можно было указать в поле <select> в качестве параметров. Я хотел добавить значение заполнителя к параметрам окна выбора.

Я попытался использовать array_merge:

$placeholder = "Month";
$source = array
(
    '01' => '01 - January',
    '02' => '02 - February',
    '03' => '03 - March',
    '04' => '04 - April',
    '05' => '05 - May',
    '06' => '06 - June',
    '07' => '07 - July',
    '08' => '08 - August',
    '09' => '09 - September',
    '10' => '10 - October',
    '11' => '11 - November',
    '12' => '12 - December'
);

$source = array_merge(array('' => $placeholder), $source);

И я видел странные результаты - результирующий массив $source был похож на следующее:

(
    '' => 'Month',
    '01' => '01 - January',
    '02' => '02 - February',
    '03' => '03 - March',
    '04' => '04 - April',
    '05' => '05 - May',
    '06' => '06 - June',
    '07' => '07 - July',
    '08' => '08 - August',
    '09' => '09 - September',
    0 => '10 - October',
    1 => '11 - November',
    2 => '12 - December'
);

Обратите внимание, что по некоторым причинам он начал использовать то, что представляется автоматически целочисленными клавишами с октября по декабрь.

Я могу заменить вызов array_merge следующим:

$source = array('' => $placeholder) + $source;

И массив не переопределяется, и все в порядке, но я не понимаю, что происходит под сценой в случае array_merge.

Может кто-нибудь объяснить, что происходило с моими ключами массива, когда я использовал array_merge? Спасибо!

Ответы [ 3 ]

5 голосов
/ 03 января 2012

Проблема не в функции array_merge().

Если вы напечатаете $source до слияния, вы получите:

array(12) {
  ["01"]=>
  string(12) "01 - January"
  ["02"]=>
  string(13) "02 - February"
  // ...
}

Попробуйте переименовать ваш первый ключ '01' на '1', у вас будет следующий возврат:

array(12) {
  [1]=>
  string(12) "01 - January"
  ["02"]=>
  string(13) "02 - February"
  // ...
}

PHP автоматически преобразует ваш ключ в целое число. Но я не могу сказать вам, почему Он это делает.

РЕДАКТИРОВАТЬ:

Я нашел ответ на php.net ( PHP.net ):

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

1 голос
/ 03 января 2012

Это очень четко объяснено в руководстве :

Не забывайте, что цифровые клавиши будут перенумерованы!

Ключи, не начинающиеся с '0', рассматриваются как числовые в PHP - и, следовательно, нумеруются.

0 голосов
/ 03 января 2012

Пара пунктов в документации приводит к объяснению этого:

С array_merge :

Значения во входном массиве с цифровыми клавишами будут перенумерованы с увеличивающими ключами, начинающимися с нуля.

А из Массивы :

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

Это объясняет, почему первые ключи не рассматриваются как цифровые клавиши, и, следовательно, они не переиндексируются. Другие ваши клавиши отображаются как цифровые клавиши.

...