在PHP中通过整数索引访问关联数组

时间:2011-01-22 16:52:05

标签: 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.

如何在不使用密钥字符串的情况下实现此目的?

6 个答案:

答案 0 :(得分:169)

使用array_keys

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

希望这会有所帮助。

答案 1 :(得分:24)

数字和关联索引键之间没有相关性。

如果您要使用键/值的数组索引设置关联数组的值,则必须使用给定的键,设置$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

这将创建一个仅在第三个位置保存元素的数组。

或者您可以使用ArrayIteratorArrayIterator实现了一个Seekable接口,可以让您在数组中寻找特定的位置/偏移量,然后获取:

$iterator = new ArrayIterator($array);
$iterator->seek(3);
echo $iterator->current(); // value

答案 2 :(得分:16)

虽然array_keys()允许访问第n个密钥,但array_values会为您提供第n个值。

<?php
$array = [
   0     => 'Zero',
   '1'   => 'One',
   'Two' => 'Two',
];
echo array_values($array)[2];
?>

将输出'Two'。

一个优于另一个吗?好吧,我能看到的唯一一个次要的是数组访问次数。

使用array_keys(),您需要3。

  1. 从数据阵列中获取密钥。
  2. 从密钥列表中获取第n个密钥。
  3. 使用数据数组中的第n个键获取值。
  4. 使用array_values(),您只需要2。

    1. 从数据数组中获取值。
    2. 从值列表中获取第n个值。
    3. 但是,另一方面,密钥通常较小,数据可能会非常嵌套,因此,总的来说,使用array_keys()可能更安全。

答案 3 :(得分:1)

另一种可能性是将其转换为普通数组:

  

$ arraybuff = implode(“~~~”,$ my_arr);
  $ my_arr = explode(“~~~”,$ arraybuff);

其中“~~~”是您的数据中不会出现的分隔符。

现在,您可以使用等于偏移的数字索引来访问数组。

如果您仍需要保留关联数组,只需将其分配给另一个变量即可。

答案 4 :(得分:1)

试试这个。它适合你。

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

答案 5 :(得分:1)

如果数组很大,array_keysarray_values都会浪费,因为它们会分配一个与原始数组大小相同的新数组,只是为了得到 nth 键(或值)。

array_slice接受整数偏移并处理关联数组。您可以使用它在恒定时间内获取(并设置) nth 键。

// 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;