密钥是数组固有的吗?

时间:2018-10-02 15:28:48

标签: php arrays key

似乎我所有的问题都太基础了,以至于我在任何地方都找不到答案,这可能是因为所有指南都假定您至少具有一些基本知识。无论如何,我的问题...

关于PHP,数组固有的键是吗?换句话说,如果我从$_POST数组中为我提供一组值的表单中获取数据,则默认情况下是否存在分配给这些值的键,或者只有在显式创建键时才存在键吗?我假设如果不创建它们,就不会有键,但是我怀疑可能会有数字键自动分配给每个值。

3 个答案:

答案 0 :(得分:1)

从最基本的意义上讲,“键”只是计算机如何在数组中查找所需值的指令。因此,密钥就像价值单元的地址。而且,在没有地址的城市中您也找不到房子-因此,如果没有键,您也可能找不到数组中的值。大多数编程语言都支持纯数组,其中key只是一个整数-0、1、2、3,...考虑此数组在内存中的元素布局:

Element index/key:  0 1 2 3 4
Value:              A B C D E

当您要求购买计算机时-给我array[3]元素-它知道 它需要查看存储单元array_byte_offset_in_ram + size_in_bytes_of(array_element) * 3
用人类语言表达的相同指令将是“找到第一个数组元素存储在内存中的位置,然后从它向前跳转到内存中要存储一个数组元素所需的3倍的内存量”。通过这样做,算法将找到您的单元并获取值D。

对于任意键的数组,当键可以是任何字符串时-则是另一回事了。但是想法仍然是一样的-从关键计算机应该推断出如何在内存中找到所需的元素单元。通常,这是通过将任意字符串键转换为整数哈希值来完成的。然后将这些哈希排序并执行二进制搜索算法以找到所需哈希值的整数索引。最后一步是将找到的索引传递到另一个存储实际值的普通数组中。

考虑此数组:

Element key: 'ABC' 'EFG' 'CDE'
Value:          a     b     c

有很多计算哈希的方法,但为简单起见,请考虑使用愚蠢的哈希函数
hash(string) = sum(ascii_values_of_chars_in_string)

所以我们有以下哈希表:

hash('ABC') = ord('A')+ord('B')+ord('C')
hash('EFG') = ord('E')+ord('F')+ord('G')
hash('CDE') = ord('C')+ord('D')+ord('E')

对散列进行排序后,我们生成并保存以下散列数组:

hash[0] = 198
hash[1] = 204
hash[2] = 210

现在我们可以将数组值保存到另一个普通数组中,其中整数索引应该与保存的hash(key)函数输出的哈希数组索引相同=>

value[0] = 'a'
value[1] = 'c'
value[2] = 'b'

现在,当您请求时-给我array['EFG']值-计算机计算密钥'EFG'哈希值是210。然后通过使用二进制搜索算法,在哈希表中找到210值,并得出哈希表中的索引是{ {1}}。因此,使用上述普通数组技术将其跳转到索引2的值表,并获取2的结果值,该值将返回给您。

这些是阵列键的主要原理。当然,幕后还有很多东西-例如哈希冲突等。但是到现在为止,您不需要像现在这样更加复杂。只需记住,计算机架构最多都是准系统-它们上只有纯数字和数学运算-没有像“字符串” /“对象”和其他宇宙那样奇特的东西:-)

答案 1 :(得分:0)

如果将现有数组分配给新变量,则就像将数组复制到该变量一样。 假设您有:

$initialArray = ["test1" => "My First Test", "test2" => "My Second Test"];

如果您初始化一个新变量,并说它应该等于您想要的数组:

$aNewArray = $initialArray;

您的新阵列将完全与您说的要复制的阵列相同; 另外,如果在复制到$ aNewArray之后更改$ initialArray,则更改将仅影响您更改的变量,使$ aNewArray在更改之前具有相同的数据。

现在,如果您只是将几个变量设置为数组而不指定用于访问它们的键,它将自动通过数字索引链接它们:

$arrayWithoutSpecificKeys = ["one", "two", "three"];
print_r($arrayWithoutSpecificKeys);

此输出将是:

array (
     0 => "one",
     1 => "two",
     2 => "three"
);

永远不要忘记从索引0开始的数组;

这意味着如果将$ _POST分配给变量,它将继承键=>传输的值。

在您的表单中,您将这样命名输入:

<input type="text" name="surname" .../>

您的$ _POST变量将具有一个数组,其中包含您在输入中设置的任何信息,并将它们链接为以下行:

["surname" => "<your typed value>"]

然后,如果将$ _POST复制到一个变量,则该变量将继承$ _POST包含的所有内容;

希望它有所帮助!

答案 2 :(得分:0)

  

PHP中的数组实际上是有序映射。地图是一种   将值与键相关联。

PHP Documentation

这意味着您只能具有一个索引,但是您需要知道数组实现了内部指针,从技术上讲,您可以通过依次跳至每个数组条目来迭代数组。这就是foreach为您所做的。您可以检查next documentation以获得更多详细信息。

如果在创建数组时不提供键,则将自动分配键。由以下代码行创建的数组将为其每个元素(从0开始)分配索引(键):

$array = array("foo", "bar", "hello", "world");