Я хочу установить значение ассоциативного массива, используя индекс массива пары ключ / значение. Например:
$my_arr = array( "bling" => "some bling", "bling2" => "lots O bling" );
$my_arr[1] = "not so much bling"; // Would change the value with key bling2.
Как это можно сделать без использования ключевой строки?
name of the student
.without using a key string
.array[1] === $array['foo']
. В массиве все еще может содержаться другое значение в$array[1]
. Обратите внимание, что я не говорю, что ваше решение неверно. Это предположение ОП.Между числовыми и ассоциативными индексными ключами нет корреляции.
Когда вы говорите, что хотите установить значение ассоциативного массива, используя индекс массива ключа / значения , тогда вы должны использовать данный ключ, настройка
$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
. Не существует такой сущности, как «неассоциативный ключ». Если вы хотели указать, что вы не можете вернуть ключ второй строки (предполагая, что массив ключей содержит только строки), то то, что вы говорите, правильно.$stringKeys = array_filter(array_keys($array), "is_string");
дает строковые ключи.Пока
array_keys()
разрешен доступ к n-му ключу,array_values
вы получите n-е значение.<?php $array = [ 0 => 'Zero', '1' => 'One', 'Two' => 'Two', ]; echo array_values($array)[2]; ?>
выведет «Два».
Есть ли у одного преимущество перед другим? Ну, единственное, что я вижу, это количество обращений к массиву.
С
array_keys()
вас нужно 3.С
array_values()
, вам нужно всего 2.Но, с другой стороны, ключи обычно меньше по размеру, а данные могут быть сильно вложенными, поэтому в целом использование ключа,
array_keys()
вероятно, безопаснее.источник
Если массив большой, оба
array_keys
и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;
источник
Попробуй это. Это работает на вас.
$result= array_values($my_arr); // Array with indexes you need
источник
Другая возможность - преобразовать его в обычный массив:
Где «~~~» - это разделитель, который не встречается в ваших данных.
Теперь вы можете получить доступ к массиву, используя числовые индексы, равные смещениям.
Если вам все еще нужно сохранить ассоциативный массив, просто назначьте его другой переменной.
источник