内置 PHP 数据结构功能
PHP 的标准 PHP 库 SPL 有丰富的内置数据结构。在 PHP 7 发布之后,人们认为 SPL 数据结构的实现与旧版 PHP 相比不是很 "高性能"。因此,我们将讨论专为数据结构设计的新 PECL 扩展。我们还对 PHP 数组提供了非常强大的支持,它可以用作集合、向量、映射、散列表、栈、队列、集合、字典等。与数组相比,SPL 是一种相当新的数据结构,但它仍能通过内置的核心数据结构的多样化实现来吸引人们的眼球。自 PHP 5.0 起,SPL 已随 PHP 核心一起发布,因此不需要额外的扩展或构建。在第 2 章 "了解 PHP 数组" 中,我们已经探讨了 PHP 数组的动态特性。在本章中,我们将列举 PHP 在操作数据结构时可用的其他一些有用函数。
使用 PHP 数组
PHP 数组拥有更广泛的预定义函数集,使 PHP 数组成为 PHP 中最常用的功能之一。我们不会讨论所有可用的 PHP 数组函数。我们将讨论一些在数据结构操作中非常有用的函数。下面是 PHP 数组函数:
-
array_pop:弹出数组的最后一个元素,与堆栈弹出操作类似。数组作为引用传递给函数。它只需要一个参数,即数组的名称。
-
array_push:该函数将一个或多个元素推到数组的末尾,就像栈推操作一样。我们已经看到,我们可以使用 push 一次推送一个元素。在 PHP 数组中,我们可以将多个值推送到当前数组的末尾。如图所示,数组在函数中作为引用传递:
$countries = []; array_push($countries, 'Bangladesh', 'Bhutan');
-
current:每个数组都有一个内部指针,用于确定当前所处的位置。最初,它从数组的第一个元素开始。current 函数返回数组的当前指针,并返回当前位置元素的值。如果我们将数组视为一个列表,则需要使用这些内部指针功能。
-
prev:prev 函数将内部指针向后移动一步。PHP 数组可以作为一个双链表来工作,prev 函数用于向前移动指针。
-
next:next 函数将内部指针移动到下一个元素。
-
end:函数 end 将内部数组指针移动到数组的末尾。
-
reset:函数 reset 将内部数组指针移动到数组的起始位置。
-
array_search:这是一个非常有用的函数,用于在数组中搜索元素。如果在数组中找到该元素,则返回找到该元素的相应索引。如果没有找到,则返回 false。如果多个元素都有相同的搜索关键字,它将返回第一个出现的索引。我们必须小心,因为如果在第一个索引中找到元素,该函数也可能返回 0。因此,我们必须在比较过程中通过严格的类型检查来检查布尔 false。
array_search
函数有两个必选参数:need 和 haystack。Needle 是我们要查找的元素,haystack 是我们要查找该元素的数组。例如,如果我们要在字典中查找一个单词,那么我们可以将 "need"(针)和 "dictionary"(字典)作为搜索单词。 -
第三个参数是可选参数,用于对元素进行严格的类型检查。因此,如果设置为 true,则不仅会按值搜索元素,还会按类型搜索:
$countries = ["Bangladesh", "Nepal", "Bhutan"]; $key = array_search("Bangladesh", $countries); if ($key !== FALSE) echo "Found in: " . $key; else echo "Not found";
输出结果如下:
Found in: 0
如果我们在
if
条件检查中使用了!=
,那么结果中就会显示 Not found。 -
array_sum:这是另一个方便的 PHP 内置函数,用于获取给定数组的总和。它将返回一个数值,即数组中所有元素的总和。可以是整数或浮点数。
-
array_map:如果我们想改变数组中具有某种属性的元素,这是一个非常有用的函数。例如,我们想让数组中的所有文本都大写或小写。与其运行一个循环,我们可以使用该函数来实现这一目的。
array_map
函数有两个参数。第一个是可调用函数,第二个是数组本身。函数返回修改后的数组,如图所示:$countries = ["bangladesh", "nepal", "bhutan"]; $newCountries = array_map(function($country) { return strtoupper($country); }, $countries); foreach ($newCountries as $country) echo $country . "\n";
或者,我们也可以这样写:
$countries = ["bangladesh", "nepal", "bhutan"]; $newCountries = array_map('strtoupper', $countries); foreach ($newCountries as $country) echo $country . "\n";
前面的代码应用
array_map
函数对给定数组中的每个单词进行大写。这两个代码都将产生以下输出结果:BANGLADESH NEPAL BHUTAN
-
array_rand:如果我们需要从给定数组中随机抽取一个或多个项,这个函数会非常有用。默认值为 1,但我们可以随时增加。
-
array_shift:这个函数从数组的开头移动一个元素,这与我们的 dequeue 非常相似: 该函数从数组开头移除一个元素,这与队列数据结构中的 dequeue 操作非常相似。移出的元素将从函数中返回:
$countries = ["bangladesh", "nepal", "bhutan"]; $top = array_shift($countries); echo $top;
这将在命令行中显示孟加拉国(bangladesh)的输出结果。
$countries
数组中只有尼泊尔和不丹。 -
array_unshift:此函数在数组开头添加一个或多个项,并移除现有项。
-
shuffle:如果我们出于某种原因需要对数组进行洗牌,可以使用此函数。
-
array_intersect:该函数将两个或多个数组作为参数,返回第一个数组中的公共项,并找出其他数组中的公共项。该函数还能保留键值。
-
array_diff:该函数计算一个数组与其他给定数组之间的差值。与
array_intersect
函数一样,该函数也将多个数组作为参数,其中第一个参数是基本数组,其他数组则与之比较,以进行差分。
PHP 中有许多有用的数组函数,它们解决了许多现有的数据结构和算法问题。我们可以在 PHP 文档中找到内置数组函数的列表。为了本书的目的,我们将在接下来的章节中探讨更多用于排序的数组函数。关于其他函数,建议进一步阅读 PHP.NET。