Доступ к ассоциативному массиву с помощью целочисленного индекса в 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. 

Как это может быть достигнуто без использования ключевой строки?

Используйте 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 равен foo, хотя его ключ равен 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 ключу, array_values даст вам n-ое значение.

 <?php $array = [ 0 => 'Zero', '1' => 'One', 'Two' => 'Two', ]; echo array_values($array)[2]; ?> 

выведет «Два».

Есть ли преимущество одного над другим? Ну, единственное, что я вижу, это количество доступа к массиву.

С помощью array_keys() вам нужно 3.

  1. Получите ключи из массива данных.
  2. Получите n-й ключ из списка ключей.
  3. Получите значение, используя n-й ключ из массива данных.

С array_values() вам нужно всего 2.

  1. Получите значения из массива данных.
  2. Получите n-ое значение из списка значений.

Но, с другой стороны, ключи обычно меньше, и данные могут быть очень вложенными, поэтому, в балансе, использование array_keys() , вероятно, безопаснее.

Другая возможность – преобразовать его в обычный массив:

$ arraybuff = implode ("~~~", $ my_arr);
$ my_arr = explode ("~~~", $ arraybuff);

Где «~~~» – это разделитель, который не встречается в ваших данных.

Теперь вы можете получить доступ к массиву с использованием числовых индексов, равных смещениям.

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

Попробуй это. Это работает для вас.

 $result= array_values($my_arr); // Array with indexes you need 

Если массив большой, как array_keys и array_values будут array_values , поскольку они будут выделять новый массив того же размера, что и оригинал, просто чтобы получить n-й ключ (или значение).

array_slice принимает целочисленное смещение и работает на ассоциативных массивах. Вы можете использовать его для получения (и установки) n-го ключа в постоянное время.

 // This will at most allocate 2 temporary arrays of 1 element each $key = array_keys(array_slice($array, $n, 1, true))[0]; $array[$key] = $value;