我想使用键/值对的数组索引设置关联数组的值。例如:
$my_arr = array( "bling" => "some bling", "bling2" => "lots O bling" );
$my_arr[1] = "not so much bling"; // Would change the value with key bling2.
如何在不使用密钥字符串的情况下实现此目的?
答案 0 :(得分:169)
答案 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
这将创建一个仅在第三个位置保存元素的数组。
或者您可以使用ArrayIterator
。 ArrayIterator
实现了一个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。
使用array_values()
,您只需要2。
但是,另一方面,密钥通常较小,数据可能会非常嵌套,因此,总的来说,使用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_keys
和array_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;