我想使用关联数组中的键/值对的索引来设置其值。例如:
$my_arr = array( "bling" => "some bling", "bling2" => "lots O bling" );
$my_arr[1] = "not so much bling"; // Would change the value with key bling2.
如何在不使用键字符串的情况下实现这个目标?
我想使用关联数组中的键/值对的索引来设置其值。例如:
$my_arr = array( "bling" => "some bling", "bling2" => "lots O bling" );
$my_arr[1] = "not so much bling"; // Would change the value with key bling2.
如何在不使用键字符串的情况下实现这个目标?
数字索引和关联索引之间没有相关性。
当您想要使用键/值的数组索引设置关联数组的值时,必须使用给定的键,设置$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
array_keys
返回的4个值。不存在“非关联键”的实体。如果您的意思是指出您无法返回第二个字符串键(通过假设键数组仅包含字符串),那么您所说的是正确的。$stringKeys = array_filter(array_keys($array), "is_string");
可以提供字符串键。 - ToolmakerStevearray_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()
可能更安全。
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;
试一下,它适用于您。
$result= array_values($my_arr); // Array with indexes you need
另一种可能性是将其转换为普通数组:
$arraybuff = implode("~~~",$my_arr);
$my_arr = explode("~~~",$arraybuff);
其中"~~~"是一个在您的数据中不会出现的分隔符。
现在,您可以使用等于偏移量的数字索引访问数组。
如果您仍然需要保留关联数组,请将其分配给另一个变量。
array [1] === $ array ['foo']
。数组仍然可以在$ array [1]
中包含另一个值。请注意我并没有说您的解决方案是错误的。这是OP的假设。 - Gordon