Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中通过整数索引访问关联数组_Php - Fatal编程技术网

在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%工作。此外,这使得处理器只需进行简单的阵列访问,就需要大量的工作和浪费的内存。这是一个不错的解决方案!