Доступ к ассоциативному массиву по целочисленному индексу в PHP
Я хочу установить значение ассоциативного массива, используя индекс массива пары ключ / значение. Например:
$my_arr = array( "bling" => "some bling", "bling2" => "lots O bling" );
$my_arr[1] = "not so much bling"; // Would change the value with key bling2.
Как это можно сделать без использования ключевой строки?
6 ответов:
использовать array_keys.
$keys = array_keys($my_arr); $my_arr[$keys[1]] = "not so much bling";надеюсь, что это помогает.
нет никакой корреляции между числовыми и ассоциативными индексными ключами.
когда вы говорите, вы хотите установите значение ассоциативного массива, используя индекс массива ключа / значения, то вы должны использовать данный ключ, установка
$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 ( //key value offset/position [100] => foo // 0 [foo] => bar // 1 [50] => baz // 2 [some] => value // 3 )что означает элемент со смещением 0 это фу, хотя это ключ 100. Если вы хотите извлечь элементы из массива по смещению, вы должны использовать
$third = array_splice($array, 2, 1); echo $third[0]; // bazэто создаст массив, содержащий только элемент в третьей позиции.
или вы могли бы использовать
ArrayIterator. ЭлементArrayIteratorосуществляетSeekableинтерфейс, который позволяет вам искать определенную позицию / смещение в массиве, а затем извлекать это:$iterator = new ArrayIterator($array); $iterator->seek(3); echo $iterator->current(); // value
пока
array_keys()разрешает доступ к N-му ключу,array_valuesдаст вам N-е значение.<?php $array = [ 0 => 'Zero', '1' => 'One', 'Two' => 'Two', ]; echo array_values($array)[2]; ?>выводится 'два'.
есть ли преимущество одного над другим? Ну, единственный незначительный, который я вижу, это количество обращений к массиву.
С
array_keys()нужно 3.
- получить ключи из массива данных.
- получить N-й ключ из списка ключей.
- получить значение с помощью n-го ключа из данных матрица.
С
array_values(), вам нужно только 2.
- получить значения из массива данных.
- получить N-е значение из списка значений.
но, с другой стороны, ключи обычно меньше, и данные могут быть очень вложенными, поэтому, в балансе, используя
array_keys()Это, наверное, безопаснее.
еще одна возможность-преобразовать его в обычный массив:
$arraybuff = implode ( " ~~~",$my_arr);
$my_arr = explode ( " ~~~",$arraybuff);где "~ ~ ~ " - это разделитель, который не будет встречаться в ваших данных.
вы можете получить доступ к массиву, используя числовые индексы, равные смещениям.Если вам все еще нужно сохранить ассоциативный массив, просто назначьте его другой переменной.
если массив большой, как
array_keysиarray_valuesбудет расточительно, так как они будут выделять новый массив того же размера, что и оригинал, просто чтобы получить nth
Comments