PHP中的数字和关联数组是两个不同的东西吗?

时间:2011-05-08 23:54:56

标签: php arrays

这是对我之前的问题的深入探讨:Can items in PHP associative arrays not be accessed numerically (i.e. by index)?

根据W3Schools,:

  

在PHP中,有三种   阵列:

     
      
  • 数字数组 - 具有数字索引的数组
  •   
  • 关联数组 - 每个ID键与值
  • 关联的数组   
  • 多维数组 - 包含一个或多个数组的数组
  •   

但这是准确的吗?可以为数组中的每个元素分配索引或字符串作为键 - 那么当两者在同一个数组中混合时会发生什么?

$myArray[0] = 'value1';
$myArray['one'] = 'value2';

5 个答案:

答案 0 :(得分:6)

PHP中的所有数组都是相同的;它们被实现为散列映射,它将键与值相关联,无论键的类型如何。

Manual

  

索引和关联数组类型在PHP中是相同的类型,它们都可以包含整数和字符串索引。

如果数组同时具有数字和非数字索引,我仍称它为关联数组。 “联想”的含义仍然存在。

Wikipedia

  

关联数组是一种抽象数据类型,由一组唯一键和一组值组成,其中每个键与一个值(或一组值)相关联。

     

...

     

从计算机程序员的角度来看,关联数组可以被视为数组的泛化。虽然常规数组将整数键(索引)映射到任意数据类型的值,但关联数组的键也可以任意键入。在某些编程语言中,例如Python,关联数组的键甚至不需要是相同的类型。

对于最后一句,同样适用于PHP,如您的示例所示。

答案 1 :(得分:6)

PHP实际上没有数组。他们是字典。数字键与字符串键同时允许。它们可以混合在一起并且共存。

(实际上像“123”这样的字符串键总是被视为整数.PHP不会保留它们的类型信息。)

如果您想要一种不同的行为,您可以实现并扩展ArrayObject。并且可以实现一个映射,其中数字键用作字符串索引的别名。

答案 2 :(得分:4)

通常,您应该阅读official documentation而不是W3Schools

数组可以包含它想要的任何成员,无论它想要什么键。

W3Schools提供的描述很模糊,甚至是错误的。

  
      
  • 数字数组 - 具有数字索引的数组
  •   

我会说数字数组是一个只有 整数索引的数组。一个 one 的数组我可能会调用 mixed (或关联,见下文)数组,如果我不得不调用它。

  
      
  • 关联数组 - 每个ID键与值相关联的数组。
  •   

我不知道那个描述。我会说如果数组可以是关联的,如果它将字符串映射到值而不是数字索引。

  
      
  • 多维数组 - 包含一个或多个arraysNumeric数组的数组 - 具有数字索引的数组
  •   

关联数组也可以包含数组,这使得它是多维的。

请记住,包含所有数字键的数组(即使在字符串中)将始终被视为数字数组。这可能意味着不同背景下的不同事物。

$arr = array(
 '1' => 'abc',
 2 => 'def'
);

var_dump($arr);

输出

array(2) {
  [1]=>
  string(3) "abc"
  [2]=>
  string(3) "def"
}

答案 3 :(得分:0)

你得到一个关联数组。试试这段代码:

$myArray[0] = 'value1';
$myArray['one'] = 'value2';

echo($myArray[1]);

请参阅?它没有回应任何东西。

答案 4 :(得分:0)

关于 PHP 有序数值数组与无序 PHP 数值数组的重要注意事项,其中不遵守顺序(3, 1, 2, 0 而不是 0, 1, 2, 3 ...)是当您使用返回 JSON 有效负载的 API 时。在客户端,例如用 Javascript 编写的客户端,如果您期望使用数组而不是对象,则可能会遇到一些困难。这就是为什么有时在 PHP 端,您会看到返回如下内容:

return array_values($array);

enter image description here