Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Используйте array_keys.

$keys = array_keys($my_arr);
$my_arr[$keys[1]] = "not so much bling";

Надеюсь, это поможет.

Ответ 2

Нет никакой корреляции между числовыми и ассоциативными ключами индекса.

Когда вы говорите, что хотите установить значение ассоциативного массива с использованием индекса массива ключа/значения, тогда вы должны использовать заданный ключ, установка $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

Ответ 3

Пока 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(), вероятно, безопаснее.

Ответ 4

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

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

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

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

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

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

Ответ 5

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

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

Ответ 6

Если массив большой, оба 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;