更好地理解 PHP 数组

PHP 数组是如此动态和灵活,以至于我们必须考虑它是普通数组、关联数组还是多维数组,就像在其他语言中一样。我们不需要定义要使用的数组的大小和数据类型。为什么 PHP 可以做到这一点,而 C 和 Java 等其他语言却做不到呢?答案很简单:PHP 中的数组概念实际上并不是真正的数组,它实际上是一个 HashMap。换句话说,PHP 中的数组不是其他语言中简单的数组概念。一个简单的数组是这样的:

image 2023 11 07 10 39 10 643

但是,我们绝对可以使用 PHP 做到这一点。让我们看一个例子:

$array = [1,2,3,4,5];

这一行显示了典型数组的外观。类似的数据类型都有一个顺序索引(从 0 到 4)来访问数值。那么谁说 PHP 数组不是典型数组呢?让我们再看几个例子。请看下面的例子:

$mixedArray = [];
$mixedArray[0] = 200;
$mixedArray['name'] = "Mixed array";
$mixedArray[1] = 10.65;
$mixedArray[2] = ['I', 'am', 'another', 'array'];

这是一个我们日常使用的 PHP 数组;我们没有定义其大小,但我们可以存储整数、浮点数、字符串甚至另一个数组。这听起来很奇怪,还是说这只是 PHP 的一种超级功能?我们可以看看 http://php.net 中的定义。

PHP 中的数组实际上是一个 有序的 map。map 是一种将值与键相关联的类型。这种类型针对几种不同的用途进行了优化;它可以被当作数组、列表(矢量)、哈希表(映射的一种实现)、字典、集合、栈、队列等等。由于数组值可以是其他数组,因此也可以是树形数组和多维数组。

因此,PHP 数组具有真正的超能力,它可以用于所有可能的数据结构,如列表/向量、哈希表、字典、集合、栈、队列、双链表等等。PHP 数组的构造方式似乎是这样的:它要么对一切都进行了优化,要么对什么都没有优化。我们将在本章中探讨这个问题。

如果要对数组进行分类,那么主要有三种类型的数组:

  • 数字数组

  • 关联数组

  • 多维数组

我们将通过一些示例和解释来探索每种类型的数组。

数值数组

数字数组并不意味着只能保存数字数据。事实上,这意味着索引只能是数字。在 PHP 中,数组可以是顺序数组,也可以是非顺序数组,但必须是数字数组。在数值数组中,数值是以线性方式存储和访问的。下面是一些 PHP 数字数组的示例:

$array = [10,20,30,40,50];
$array[] = 70;
$array[] = 80;

$arraySize = count($array);
for($i = 0;$i<$arraySize;$i++) {
    echo "Position ".$i." holds the value ".$array[$i]."\n";
}

这将有以下输出:

Position 0 holds the value 10
Position 1 holds the value 20
Position 2 holds the value 30
Position 3 holds the value 40
Position 4 holds the value 50
Position 5 holds the value 70
Position 6 holds the value 80

这是一个非常简单的示例,我们定义了一个数组,索引从 0 开始自动生成,并根据数组的值递增。当我们使用 $array[] 在数组中添加一个新元素时,它实际上会递增索引,并在新索引中赋值。这就是为什么值 70 的索引为 5,而值 80 的索引为 6。

如果数据是连续的,我们可以使用 for 循环,不会有任何问题。当我们说顺序时,我们指的不仅仅是 0,1,2,3…​.,n。它可以是 0,5,10,15,20,…​…​,n,其中 n 是 5 的倍数。也可以是 1,3,5,7,9…​…​,n,其中 n 是奇数。我们可以创建数百个这样的序列来使数组数值化。

一个很大的问题是,如果索引不是连续的,我们就不能构造一个数值数组吗?当然可以。我们只需采用不同的迭代方式。请看下面的例子:

$array = [];
$array[10] = 100;
$array[21] = 200;
$array[29] = 300;
$array[500] = 1000;
$array[1001] = 10000;
$array[71] = 1971;

foreach($array as $index => $value) {
    echo "Position ".$index." holds the value ".$value."\n";
}

如果我们看一下索引,它们并不是按顺序排列的。它们的索引是随机的,比如 10 之后是 21、29 等等。即使是最后的索引 71,也比之前的 1001 小得多。那么,最后一个索引应该显示在 29 和 500 之间吗?下面是输出结果:

Position 10 holds the value 100
Position 21 holds the value 200
Position 29 holds the value 300
Position 500 holds the value 1000
Position 1001 holds the value 10000
Position 71 holds the value 1971

这里有几件事需要注意:我们是按照输入数据的方式迭代数组的。虽然索引都是数字,但内部根本没有排序。另一个有趣的事实是,数组 $array 的大小只有 6。它不像 C++、Java 或其他语言那样,在使用数组之前需要预先定义数组的大小,而且最大索引可以是 n-1,其中 n 是数组的大小。

关联数组

关联数组通过键进行访问,键可以是任何字符串。在关联数组中,值是根据键而不是线性索引存储的。我们可以使用关联数组存储任何类型的数据,就像数字数组一样。让我们创建一个学生数组来存储学生信息:

$studentInfo = [];
$studentInfo['Name'] = "Adiyan";
$studentInfo['Age'] = 11;
$studentInfo['Class'] = 6;
$studentInfo['RollNumber'] = 71;
$studentInfo['Contact'] = "info@adiyan.com";

foreach($studentInfo as $key => $value) {
    echo $key.": ".$value."\n";
}

下面是代码的输出结果:

Name: Adiyan
Age: 11
Class: 6
RollNumber: 71
Contact: info@adiyan.com

在这里,我们使用每个键来保存一条数据。我们可以根据需要随意添加键。这样,我们就可以灵活地使用 PHP 关联数组来表示类似于 structure、map 和 dictionary 的数据结构。

多维数组

多维数组包含多个数组。换句话说,它是一个数组的数组。在本书中,我们将在不同的示例中使用多维数组,因为多维数组是图和其他树形数据结构中最常用、最有效的数据存储方式之一。让我们通过一个例子来了解 PHP 多维数组:

$players = [];
$players[] = ["Name" => "Ronaldo", "Age" => 31, "Country" => "Portugal", "Team" => "Real Madrid"];
$players[] = ["Name" => "Messi", "Age" => 27, "Country" => "Argentina", "Team" => "Barcelona"];
$players[] = ["Name" => "Neymar", "Age" => 24, "Country" => "Brazil", "Team" => "Barcelona"];
$players[] = ["Name" => "Rooney", "Age" => 30, "Country" => "England", "Team" => "Man United"];

foreach($players as $index => $playerInfo) {
    echo "Info of player # ".($index+1)."\n";
    foreach($playerInfo as $key => $value) {
        echo $key.": ".$value."\n";
    }
    echo "\n";
}

我们刚才看到的示例是一个二维数组。因此,我们使用两个 foreach 循环来遍历二维数组。下面是代码的输出结果:

Info of player # 1
Name: Ronaldo
Age: 31
Country: Portugal
Team: Real Madrid

Info of player # 2
Name: Messi
Age: 27
Country: Argentina
Team: Barcelona

Info of player # 3
Name: Neymar
Age: 24
Country: Brazil
Team: Barcelona

Info of player # 4
Name: Rooney
Age: 30
Country: England
Team: Man United

我们可以根据需要使用 PHP 创建 n 维数组,但必须记住一点:维数越多,结构就越复杂。我们人类的视觉通常是三维的,因此要想拥有三维以上的数组,我们必须对数组如何在多维中工作有一个扎实的了解。

在 PHP 中,我们可以将数字数组和关联数组作为一个数组使用。但在这种情况下,我们必须非常谨慎地选择正确的方法来遍历数组元素。在这种情况下,foreach 是比 forwhile 循环更好的选择。