Между числовыми и ассоциативными индексными ключами нет корреляции.
Когда вы говорите, что хотите установить значение ассоциативного массива, используя индекс массива ключа / значения , тогда вы должны использовать данный ключ, настройка $array[1]не совпадает с настройкой $array['foo'].
Рассмотрим этот массив
print_r( array('foo', 'foo' => 'bar', 'baz', 'some' => 'value') );
Это даст
Array
(
[0] => foo
[foo] => bar
[1] => baz
[some] => value
)
Foo - второй элемент в массиве. Это смещение , но оно не имеет ничего общего с индексом 1. Как вы можете видеть, в приведенном выше массиве индекс 1 связан с baz. Неверно предполагать, что именно потому, что fooэто первый ассоциативный ключ, он имеет какое-либо отношение к фактическому числовому ключу 1. Точно так же, как someне коррелирует с 2.
Аналогичным образом, для смешанного массива, подобного показанному выше, решение, array_keysпредложенное в другом месте на этом сайте, не будет работать, потому что
print_r( array_keys(array('foo', 'foo' => 'bar', 'baz', 'some' => 'value')) );
дам
Array
(
[0] => 0
[1] => foo
[2] => 1
[3] => some
)
Итак, когда вы это делаете, $array[$keys[1]]вы действительно делаете $array['foo']. Но если вы хотите получить доступ ко второму ассоциативному значению в этом массиве ( 'some'), вы не можете этого сделать, $array[$keys[2]]потому что это будет оценивать $array[1]и это baz.
Смещение элемента совершенно не связано с его ключом или значением.
print_r(
array(
100 => 'foo',
'foo' => 'bar',
50 => 'baz',
'some' => 'value'
)
);
действительно означает
Array
(
[100] => foo
[foo] => bar
[50] => baz
[some] => value
)
что означает, что элемент со смещением 0 равен foo, хотя его ключ равен 100. Если вы хотите извлечь элементы из массива по смещению, вы должны использовать
$third = array_splice($array, 2, 1);
echo $third[0];
Это создаст массив, содержащий только элемент в третьей позиции.
Или вы можете использовать расширение ArrayIterator. В ArrayIteratorреализует Seekableинтерфейс , который позволяет искать в определенной позиции / смещение в массиве , а затем принести что:
$iterator = new ArrayIterator($array);
$iterator->seek(3);
echo $iterator->current();