Ответ 1
Используйте array_keys.
$keys = array_keys($my_arr);
$my_arr[$keys[1]] = "not so much bling";
Надеюсь, это поможет.
Я хочу установить значение ассоциативного массива, используя индекс массива пары ключ/значение. Например:
$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 - это второй элемент массива. Это offset, но это не имеет ничего общего с индексом 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
даст вам 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
будут расточительными, так как они будут выделять новый массив того же размера, что и оригинал, просто чтобы получить 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;