PHP数组键名

时间:2016-12-09 14:37:58

标签: php arrays

对于一个项目我发现我必须开始使用数组相交。 QPalette::Base

我发现这段代码解释了该功能的作用:

<?php
$array1 = array("a" => "green", "red", "blue");
$array2 = array("b" => "green", "yellow", "red");
$result = array_intersect($array1, $array2);
print_r($result);
?>

输出让我感到困惑。

(
    [a] => green
    [0] => red
)

在这种情况下a0的含义是什么?

不应该是0 1为什么它以a开头然后变为0.

3 个答案:

答案 0 :(得分:3)

$array1 = array("a" => "green", "red", "blue");
$array2 = array("b" => "green", "yellow", "red");
$result = array_intersect($array1, $array2);

首先,我们必须按原样编写这些词典;上面的表格是“精简的”,带有隐式数字键。

$array1 is a: green, 0: red, 1: blue
$array2 is b: green, 0: yellow, 1: red

现在array_intersect检查是常见的。它们是绿色和红色。来自array1的相应

a: green
0: red

所以你有两个键,'a'和0,分别映射到绿色和红色。

此时我会补充说,混合使用数字和非数字键是灾难的一种方法,除非你非常小心你在做什么;许多PHP函数不会保留键并重新编号将字典转换为数组的值。

正如您所看到的,从字典中告诉数组并不是立竿见影的。为了增加风险,JSON编码对于两者来说完全不同,因此结构中的微小变化可能会使Web服务对话突然崩溃。

JSON

这是我最喜欢的客厅技巧。

$arr = array( 'Hello', 'World' );

正如您所期望的那样,这个JSON编码:

[ 'Hello', 'World' ]

假设我删除了最后一个元素并重新使用JSON:

[ 'Hello' ]

但是我要说我删除的元素不是最后一个。 PHP做什么?它删除元素和键,但不重新编号数组。该数组现在有一个 hole 。并且数组没有漏洞 - 词典

所以现在这是一个字典。在JSON中它突然变成:

{ "1": "World" }

这意味着此示例代码被巧妙地错误地

$arr = functionReturningArrayOfElements();

if (-1 != $killThisElement) {
    unset($arr[$killThisElement]);
}

header('Content-Type: application/json');
die(json_encode($arr));

$killThisElement是最后一个条目($ count($ arr)-1)时,JSON将被编码为数组。否则,它将被编码为字典。

在回来之前,我需要确定我的回报:

$arr = array_values($arr); // This renumbers the keys, forcing it to always be an array

$arr['count'] = count($arr);
// This adds a non-numeric key, forcing $arr to always be a dictionary.
// The extra key is called 'count' just so it makes sense, but it is also
// a BAD IDEA, since it encourages to loop through the object instead of
// using the proper Javascript Object methods. A better choice from this
// point of view would be
$arr['comment'] = 'This is a dictionary.';

答案 1 :(得分:1)

  
      
  • array_intersect()函数比较两个(或更多)数组的值,并返回匹配项。

  •   
  • 此函数比较两个或多个数组的值,并返回一个数组,其中包含array1array2等中存在的array3条目。< / p>

  •   

因此,在您的情况下,数组包含带键和不带键的元素,因此如果我们比较数组,我们会发现$array2中有greenred元素存在于{{ 1}},所以如果你使用$array1打印数组,它将把数组放入自定义&amp;保留的密钥(在未分配密钥的情况下保留)。

  

详细了解array_intersect()

因此,如果您尝试打印print_r(),那就像是:

$array1

希望这有帮助!

答案 2 :(得分:0)

表示$array1就像这样构建。

$array1 = array("a" => "green", 0 => "red", 1 => "blue");

因此,array_intersect维护这些键的关键:使用维持

的值对
"a" => "green", 0 => "red"