Я хочу установить значение ассоциативного массива, используя индекс массива пары ключ / значение. Например:
$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.
С array_values()
вам нужно всего 2.
Но, с другой стороны, ключи обычно меньше, и данные могут быть очень вложенными, поэтому, в балансе, использование 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;