在PHP中通过整数索引访问关联数组
我想使用键/值对的数组索引设置关联数组的值。例如:在PHP中通过整数索引访问关联数组,php,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. 如何在不使用键字符串的情况下完成此操作?使用 希望这有帮助 数字索引键和关联索引键之间没有相关性 如果说要使用键/值的数组索引设置关联
$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有关,这是错误的。就像一样,有些
与2不相关
同样,对于如上所示的混合数组,本站点其他地方建议的带有array\u键的解决方案将不起作用,因为
print_r( array_keys(array('foo', 'foo' => 'bar', 'baz', 'some' => 'value')) );
将给予
Array
(
[0] => foo
[foo] => bar
[1] => 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
实现了一个可搜索的
接口,该接口允许您搜索数组中的特定位置/偏移,然后获取该位置:
$iterator = new ArrayIterator($array);
$iterator->seek(3);
echo $iterator->current(); // value
另一种可能是将其转换为普通数组:
$arraybuff=内爆(“~~~”,$my_arr)
$my_arr=explode(“~~~”,$arraybuff)
其中“~~~”是数据中不会出现的分隔符
现在,可以使用等于偏移量的数字索引访问数组
如果仍然需要保留关联数组,只需将其分配给其他变量。当数组\u键()
允许访问第n个键时,数组\u值将为您提供第n个值
<?php
$array = [
0 => 'Zero',
'1' => 'One',
'Two' => 'Two',
];
echo array_values($array)[2];
?>
将输出“二”
一个比另一个有优势吗?我能看到的唯一一个小问题是数组访问的数量
使用array\u keys()
您需要3
从数据数组中获取密钥
从键列表中获取第n个键
使用数据数组中的第n个键获取值
使用array\u values()
,您只需要2个
从数据数组中获取值
从值列表中获取第n个值
但是,另一方面,键通常较小,并且数据可能会大量嵌套,因此,总的来说,使用array\u keys()
可能更安全。试试这个。它适合你
$result= array_values($my_arr); // Array with indexes you need
如果数组较大,则array\u键
和array\u值
都将是浪费,因为它们将分配一个与原始数组大小相同的新数组,只是为了获得第n个键(或值)
array\u 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;
作为旁注,为什么PHP开发人员会创建这样一种非直观的数组访问方式?@Marty这与PHP开发人员如何实现它关系不大,但更多的是与您对数组工作方式的误解有关。从技术上讲,以上仍然使用关联名称。数字索引键和关联索引键之间没有相关性。创建关联数组是因为要查找的内容比其在数组中的位置更重要。我认为这是一个很好的观点。假设您有一个数组,其中学生姓名作为键,地址作为值。你可以通过名字找到学生的地址。数组的位置与此无关。你可以根据学生的名字对数组进行排序,这是真的。但是程序员提供的是数字,而不是字符串。我认为这就是不使用键字符串的的含义,您正在将此数字映射到相应的键字符串。但这并不意味着array[1]==$array['foo']
。该数组仍然可以在$array[1]
处包含另一个值。请注意,我并不是说您的解决方案是错误的。这是OP的假设。当发布到一个已有多个回复和公认答案的旧帖子时,请小心。您需要解释为什么您的新答案比现有答案更好。Minor nit:“如果您想访问该数组中的第二个关联值('some'),您不能执行$array[$keys[2]],因为这将计算为$array[1],这在技术上是baz”,这是因为所有键,包括数字键,是关联键-由数组\u键返回的4个值
。没有“非关联键”这样的实体。如果您想指出不能返回第二个字符串键(假设键数组只包含字符串),那么您所说的是正确的<代码>$stringKeys=array\u过滤器(array\u keys($array),“是字符串”)代码>给出了字符串键。由于您应该始终考虑,这个精确的定界符可以出现在数据中,这个想法在99到9999999%中是有效的。有几种解决方案可以100%工作。此外,这使得处理器只需进行简单的阵列访问,就需要大量的工作和浪费的内存。这是一个不错的解决方案!