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

Mar*_*rty 86 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.
Run Code Online (Sandbox Code Playgroud)

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

Don*_*van 179

使用array_keys.

$keys = array_keys($my_arr);
$my_arr[$keys[1]] = "not so much bling";
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

  • 作为旁注,为什么PHP开发人员会创建一种非直观的方式来访问数组? (4认同)
  • @Marty与PHP开发人员如何实现它无关,而与您对数组如何工作的误解有关。从技术上讲,以上仍使用关联名称。数字和关联索引键之间没有关联。 (3认同)
  • 奇迹般有效.谢谢. (2认同)
  • 您创建一个关联数组,因为您要查找的内容比它在数组中的位置更重要.我认为这是一个好点.假设您有一个数组,学生姓名作为键,地址作为值.您可以通过其姓名到达学生的地址.数组的位置无关紧要.您可以按"学生姓名"对数组进行排序. (2认同)
  • @Albert,您正在将此数字映射到适当的密钥字符串。但这并不意味着`array [1] === $ array ['foo']`。该数组仍可以在$ array [1]处包含另一个值。请注意,我并不是说您的解决方案是错误的。这是OP的假设。 (2认同)

Gor*_*don 25

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

当你说你要使用的键/值的数组索引设置关联数组的值,那么你必须使用指定的键,设置$array[1]是不一样的设定$array['foo'].

考虑这个数组

print_r( array('foo', 'foo' => 'bar', 'baz', 'some' => 'value') );
Run Code Online (Sandbox Code Playgroud)

这会给

Array
(
    [0] => foo
    [foo] => bar
    [1] => baz
    [some] => value
)
Run Code Online (Sandbox Code Playgroud)

foo是数组中的第二个元素.这是偏移量,但它与索引1无关.如您所见,在上面的数组中,索引1与之关联baz.假设只是因为foo它是与实际数字键1有关的第一个关联键是错误的.就像some不与2相关.

同样,对于如上所示的混合数组,array_keys本网站其他地方建议的解决方案将无效,因为

print_r( array_keys(array('foo', 'foo' => 'bar', 'baz', 'some' => 'value')) );
Run Code Online (Sandbox Code Playgroud)

会给

Array
(
    [0] => 0
    [1] => foo
    [2] => 1
    [3] => some
)
Run Code Online (Sandbox Code Playgroud)

所以,当你这样做时,$array[$keys[1]]你真的在做$array['foo'].但是如果你想访问那个数组('some')中的第二个关联值,你就不能这样做,$array[$keys[2]]因为那会评估到$array[1]那个baz.

元素的偏移量与其键或值完全无关

print_r(
    array(
        100    => 'foo',
        'foo'  => 'bar',
        50     => 'baz',
        'some' => 'value'
    )
);
Run Code Online (Sandbox Code Playgroud)

真正意思

Array
( //key       value     offset/position
    [100]  => foo       // 0
    [foo]  => bar       // 1
    [50]   => baz       // 2
    [some] => value     // 3
)
Run Code Online (Sandbox Code Playgroud)

这意味着偏移0处的元素是foo,虽然它的关键是100.如果要通过偏移量从数组中提取元素,则必须使用

$third = array_splice($array, 2, 1);
echo $third[0]; // baz
Run Code Online (Sandbox Code Playgroud)

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

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

$iterator = new ArrayIterator($array);
$iterator->seek(3);
echo $iterator->current(); // value
Run Code Online (Sandbox Code Playgroud)


Ric*_*ing 16

虽然array_keys()允许访问第n个键,但array_values会给你第n个值.

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

将输出'Two'.

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

有了array_keys()你需要3.

  1. 从数据数组中获取密钥.
  2. 从密钥列表中获取第n个密钥.
  3. 使用数据数组中的第n个键获取值.

有了array_values(),你只需要2.

  1. 从数据数组中获取值.
  2. 从值列表中获取第n个值.

但是,另一方面,密钥通常较小,数据可能非常嵌套,因此,总的来说,使用密钥array_keys()可能更安全.


Jes*_*sse 7

如果数组很大,那么 和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;
Run Code Online (Sandbox Code Playgroud)

  • 这里有很好的解决方案! (3认同)