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


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

499   6  
PHP

6 ответов:

использовать 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 это фу, хотя это ключ 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.

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

Comments

    Ничего не найдено.