Почему, когда я добавляю в пустой массив в PHP, индекс 2? - PullRequest
0 голосов
/ 22 июля 2009

У меня есть метод в классе, который добавит элемент в член массива класса. Когда элемент массива пуст (но ранее в нем было два элемента с индексами 1 и 2) и я вызываю метод, элемент вставляется с индексом 2. Почему это так? Если кто-то не знает сразу, я могу предоставить МНОГОЕ более подробную информацию.

Ответы [ 2 ]

3 голосов
/ 22 июля 2009

Если я правильно понимаю ваш вопрос, вы находитесь в такой ситуации:

Сначала у вас есть такой массив:

$data = array(
    1 => 'abcd',
    2 => 'efg',
);
var_dump($data);

Вы сбрасываете все элементы:

unset($data[1], $data[2]);
var_dump($data);

А когда вы вставляете данные вот так:

$data[] = 'glop';
var_dump($data);

Он помещается не в индекс 0, а в 2 (на самом деле, он помещается в индекс 3, кажется - последний существующий индекс плюс один), что в итоге дает этот массив:

array(1) {
  [3]=>
  string(4) "glop"
}

Если вы это имеете в виду, это поведение описано в документации массива :

Как упоминалось выше, если нет ключа указан максимум существующих целые индексы взяты, а новый ключ будет это максимальное значение плюс 1. Если целых индексов еще не существует, ключ будет 0 (ноль).

Обратите внимание, что используется максимальный целочисленный ключ для этого не нужно в настоящее время существовать в массив. Это нужно было только существовать в массиве в какое-то время, так как последний раз массив был переиндексирован.

(а есть пример)

Надеюсь, я правильно понял вопрос (иначе, вы можете привести пример кода, фактического вывода и ожидаемого результата?) , и что это помогает: -)

0 голосов
/ 22 июля 2009

Вы уверены, что массив пуст? Если вы print_r($obj->memberArray), вы видите Array()? Какое значение count($obj->memberArray)?

Кроме того, имеют ли значение ключи? Если нет, и вы ожидаете, что массив будет пустым, вы сможете безопасно запустить $obj->memberArray = array_keys($obj->memberArray) для сброса ключей. У меня есть догадка, что PHP делает странные вещи, когда имеет дело с массивами со смешанными (некоторые числовые, некоторые строковые) индексами, и может начать резервировать индексы в этом случае, добавляя после последнего числового индекса. Просто догадка, не проверял это.

...