原文: https://zetcode.com/lang/php/arrayfunctions/

在上一章中,我们讨论了数组的初始化和细读。 在本章中,我们将介绍各种 PHP 数组函数。 这些功能使我们能够修改,排序,合并,切片和随机排列数组内的数据。

PHP 排序数组

首先,我们将对数组进行排序。

sort.php

  1. <?php
  2. $names = [ "Jane", "Rebecca", "Lucy", "Lenka", "Ada" ];
  3. echo "Unsorted: \n";
  4. foreach ($names as $name) {
  5. echo "$name ";
  6. }
  7. echo "\n";
  8. sort($names);
  9. echo "Sorted: \n";
  10. foreach ($names as $name) {
  11. echo "$name ";
  12. }
  13. echo "\n";

在上面的脚本中,我们有一个$names数组。 我们使用sort()函数对数组的内容进行排序。

  1. $ php sort.php
  2. Unsorted:
  3. Jane Rebecca Lucy Lenka Ada
  4. Sorted:
  5. Ada Jane Lenka Lucy Rebecca

脚本的输出显示未排序和已排序的女性姓名。

rsort()函数以相反的顺序对数组进行排序。

sort2.php

  1. <?php
  2. $numbers = [ 12, 3, 5, 1, 6, 7, 10, 0, 9, 8, 11];
  3. sort($numbers);
  4. echo "Ascending order: \n";
  5. foreach ($numbers as $n) {
  6. echo "$n ";
  7. }
  8. echo "\n";
  9. rsort($numbers);
  10. echo "Descending order: \n";
  11. foreach ($numbers as $n) {
  12. echo "$n ";
  13. }
  14. echo "\n";

有一个整数数组。 它按升序和降序排序。

  1. sort($numbers);

sort()函数按升序对整数进行排序。

  1. rsort($numbers);

rsort()函数按降序对整数进行排序。

  1. $ php sort2.php
  2. Ascending order:
  3. 0 1 3 5 6 7 8 9 10 11 12
  4. Descending order:
  5. 12 11 10 9 8 7 6 5 3 1 0

这是sort2.php脚本的输出。

在下面的示例中,我们显示了如何对重音字符进行排序。

locale_sort.php

  1. <?php
  2. setlocale(LC_ALL, 'sk_SK.utf8');
  3. $words = [ "ďateľ", "auto", "železo", "byt", "kocka", "dáma",
  4. "zem", "autor", "ceduľa", "čižma"];
  5. sort($words, SORT_LOCALE_STRING);
  6. echo "Ascending order: \n";
  7. foreach ($words as $w) {
  8. echo "$w ";
  9. }
  10. echo "\n";
  11. rsort($words, SORT_LOCALE_STRING);
  12. echo "Descending order: \n";
  13. foreach ($words as $w) {
  14. echo "$w ";
  15. }
  16. echo "\n";

我们有一系列包含特定口音的斯洛伐克语单词。

  1. setlocale(LC_ALL, 'sk_SK.utf8');

我们使用setlocale()函数设置斯洛伐克语区域设置。 语言环境代表特定的地理,政治或文化区域。

  1. $words = [ "ďateľ", "auto", "železo", "byt", "kocka", "dáma",
  2. "zem", "autor", "ceduľa", "čižma"];

$words是带有重音符号的斯洛伐克语单词的数组。

  1. sort($words, SORT_LOCALE_STRING);

我们使用sort()函数以升序对数组进行排序。 我们向函数传递SORT_LOCALE_STRING标志,该标志告诉sort()考虑到语言环境。

  1. $ php locale_sort.php
  2. Ascending order:
  3. auto autor byt ceduľa čižma dáma ďateľ kocka zem železo
  4. Descending order:
  5. železo zem kocka ďateľ dáma čižma ceduľa byt autor auto

单词已根据斯洛伐克语标准正确排序。

有时我们需要执行自定义排序。 对于自定义排序,我们在 PHP 中具有usort()函数。

custom_sorting.php

  1. <?php
  2. $names = [ "Michael Brown", "Albert Einstein", "Gerry Miller",
  3. "Tom Willis", "Michael Gray", "Luke Smith" ];
  4. function sort_second_names($a, $b) {
  5. $name1 = explode(" ", $a);
  6. $name2 = explode(" ", $b);
  7. return strcmp($name1[1], $name2[1]);
  8. }
  9. usort($names, 'sort_second_names');
  10. foreach ($names as $name) {
  11. echo "$name\n";
  12. }
  13. echo "\n";

我们有一个全名数组。 sort()函数将根据名字对这些字符串进行排序,因为它们在第二个名字之前。 我们创建了一个解决方案,以根据它们的名字对这些名字进行排序。

  1. function sort_second_names($a, $b) {
  2. $name1 = explode(" ", $a);
  3. $name2 = explode(" ", $b);
  4. return strcmp($name1[1], $name2[1]);
  5. }

我们有一个自定义的排序函数。 名称由explode()函数分割,并将第二个名称与strcmp()函数进行比较。

  1. usort($names, 'sort_second_names');

usort()函数接受比较函数作为其第二个参数。

  1. $ php custom_sorting.php
  2. Michael Brown
  3. Albert Einstein
  4. Michael Gray
  5. Gerry Miller
  6. Luke Smith
  7. Tom Willis

名称将根据其第二名正确排序。

PHP 计算数组大小

count()函数对数组中的元素数进行计数。 array_sum()函数计算所有值的总和。 array_product()函数计算数组中值的乘积。

counting.php

  1. <?php
  2. $numbers = [ 1, 2, 4, 5, 2, 3, 5, 2 ];
  3. $len = count($numbers);
  4. $sum = array_sum($numbers);
  5. $prod = array_product($numbers);
  6. echo "In the array, there are $len numbers\n";
  7. echo "The sum of the numbers is $sum\n";
  8. echo "The product of the numbers is $prod\n";

在示例中,我们有一个数字数组。 我们将上述定义的函数应用于数组。

  1. $ php counting.php
  2. In the array, there are 8 numbers
  3. The sum of the numbers is 24
  4. The product of the numbers is 2400

这是脚本的输出。

PHP 唯一值

在下面的示例中,我们在数组中找出唯一值。

unique.php

  1. <?php
  2. $numbers = array(3, 4, 4, 3, 2, 4);
  3. $count_values = array_count_values($numbers);
  4. print_r($count_values);
  5. $unique = array_unique($numbers);
  6. print_r($unique);

在此脚本中,数组中有重复项。 array_count_values()函数返回一个数组,其中包含每个值的出现次数。 array_unique()函数返回一个没有重复的数组。

  1. $ php unique.php
  2. Array
  3. (
  4. [3] => 2
  5. [4] => 3
  6. [2] => 1
  7. )
  8. Array
  9. (
  10. [0] => 3
  11. [1] => 4
  12. [4] => 2
  13. )

第一个数组表示 3 次出现两次,4 次出现 3 次,2 次出现一次。 第二个数组表示数组中存在三个值:3、4 和 2。值 3 的索引为 0,4 的索引为 1,2 的索引为 4。array_unique()函数保持索引不变。

PHP 切片数组

array_slice()函数从数组中返回其偏移量和长度参数所指定的元素序列。

slicing.php

  1. <?php
  2. $nums = range(1, 20);
  3. $slice1 = array_slice($nums, 0, 3);
  4. echo "Slice1:\n";
  5. foreach ($slice1 as $s) {
  6. echo "$s ";
  7. }
  8. echo "\n";
  9. $slice2 = array_slice($nums, -3);
  10. echo "Slice2:\n";
  11. foreach ($slice2 as $s) {
  12. echo "$s ";
  13. }
  14. echo "\n";

在示例中,我们创建了一个整数数组的两个切片。

  1. $slice1 = array_slice($nums, 0, 3);

我们从第一个元素开始创建一个切片; 切片的长度是三个元素。

  1. $slice2 = array_slice($nums, -3);

通过提供负偏移量,可以从数组的末尾创建切片。

  1. $ php slicing.php
  2. Slice1:
  3. 1 2 3
  4. Slice2:
  5. 18 19 20

这是slicing.php示例的输出。

PHP 数组指针

PHP 具有内部数组指针。 在下面的示例中,我们介绍了操作该指针的函数。

array_pointer.php

  1. <?php
  2. $continents = [ "America", "Africa", "Europe", "Asia", "Australia",
  3. "Antarctica" ];
  4. $item1 = current($continents);
  5. $item2 = next($continents);
  6. $item3 = next($continents);
  7. $item4 = end($continents);
  8. $item5 = prev($continents);
  9. echo "$item1, $item2, $item3, $item4, $item5\n";
  10. reset($continents);
  11. while(list($idx, $val) = each($continents)) {
  12. echo "Index: $idx, Value: $val\n";
  13. }

在此示例中,我们使用移动内部数组指针的函数遍历数组。

  1. $item1 = current($continents);
  2. $item2 = next($continents);
  3. $item3 = next($continents);
  4. $item4 = end($continents);
  5. $item5 = prev($continents);

current()函数返回数组中的当前元素。 首先,它是数组的第一个元素。 next()函数使指针前进一个位置。 end()函数返回最后一个元素。 prev()元素返回该元素,即当前元素之前的一个位置。 在我们的情况下,它是最后一个元素的下一个。

  1. reset($continents);
  2. while(list($idx, $val) = each($continents)) {
  3. echo "Index: $idx, Value: $val\n";
  4. }

在这里,我们使用reset()函数再次将内部指针设置为第一个元素,并仔细阅读$continents数组。

  1. $ php array_pointer.php
  2. America, Africa, Europe, Antarctica, Australia
  3. Index: 0, Value: America
  4. Index: 1, Value: Africa
  5. Index: 2, Value: Europe
  6. Index: 3, Value: Asia
  7. Index: 4, Value: Australia
  8. Index: 5, Value: Antarctica

这是array_pointer.php脚本的输出。

PHP 合并数组

array_merge()函数合并数组。

merge.php

  1. <?php
  2. $names1 = [ "Jane", "Lucy", "Rebecca" ];
  3. $names2 = [ "Lenka", "Timea", "Victoria" ];
  4. $names = array_merge($names1, $names2);
  5. foreach ($names as $name) {
  6. echo "$name ";
  7. }
  8. echo "\n";

在此示例中,我们有两个数组:$names1$names2。 我们使用array_merge()函数通过合并前两个数组来创建$names数组。

  1. $ php merge.php
  2. Jane Lucy Rebecca Lenka Timea Victoria

新数组有六个名称。

PHP 修改数组

可以使用array_push()array_pop()array_shift()array_unshift()函数修改 PHP 数组。

modify.php

  1. <?php
  2. $numbers = [ 1, 2, 3, 4 ];
  3. array_push($numbers, 5, 6);
  4. foreach ($numbers as $num) {
  5. echo $num, " ";
  6. }
  7. echo "\n";
  8. array_pop($numbers);
  9. foreach ($numbers as $num) {
  10. echo $num, " ";
  11. }
  12. echo "\n";
  13. array_unshift($numbers, -1, 0);
  14. foreach ($numbers as $num) {
  15. echo $num, " ";
  16. }
  17. echo "\n";
  18. array_shift($numbers);
  19. foreach ($numbers as $num) {
  20. echo $num, " ";
  21. }
  22. echo "\n";

在上面的脚本中,我们使用了修改数组内容的函数。 我们有一个$numbers数组,其中包含 4 个数字:1、2、3 和 4。

  1. array_push($numbers, 5, 6);

array_push()函数将一个或多个项目插入数组的末尾。 现在,我们的数组包含值 1、2、3、4、5 和 6。

  1. array_pop($numbers);

array_pop()函数从数组中删除最后一项。 我们的数组现在存储数字 1、2、3、4 和 5。

  1. array_unshift($numbers, -1, 0);

array_unshift()函数将 -1 和 0 添加到数组的开头。 该数组包含值-1、0、1、2、3、4 和 5。

  1. array_shift($numbers);

最后,array_shift()函数从数组中删除第一项。 现在我们在数组中具有值 0、1、2、3、4 和 5。

  1. $ php modify.php
  2. 1 2 3 4 5 6
  3. 1 2 3 4 5
  4. -1 0 1 2 3 4 5
  5. 0 1 2 3 4 5

这是modify.php示例的输出。

PHP 范围函数

range()函数通过自动创建元素序列来简化数组创建。 它接受三个参数:序列开始,序列结束和可选的增量,默认为 1。

range.php

  1. <?php
  2. $numbers1 = range(1, 15);
  3. foreach ($numbers1 as $num) {
  4. echo "$num ";
  5. }
  6. echo "\n";
  7. $numbers2 = range(15, 1, -1);
  8. foreach ($numbers2 as $num) {
  9. echo "$num ";
  10. }
  11. echo "\n";

range()函数使我们能够轻松创建连续数字列表。

  1. $numbers1 = range(1, 15);

创建一个数字为 1,2,… 15 的数组。

  1. $numbers2 = range(15, 1, -1);

通过指定负增量可以创建值的降序序列。

  1. $ php range.php
  2. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
  3. 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1

这是range.php函数的输出。

PHP 随机化数组值

array_rand()函数从数组中选择一个或多个随机条目。 shuffle()函数可将数组中元素的顺序随机化。

randomize.php

  1. <?php
  2. $nums = range(1, 20);
  3. echo ($nums[array_rand($nums)]) . "\n";
  4. $r = array_rand($nums, 2);
  5. echo $nums[$r[0]] . "\n";
  6. echo $nums[$r[1]] . "\n";
  7. shuffle($nums);
  8. foreach ($nums as $n) {
  9. echo "$n ";
  10. }
  11. echo "\n";

在示例中,我们从数组中选择随机值,并随机化其元素顺序。

  1. echo ($nums[array_rand($nums)]) . "\n";

array_rand()函数从$num数组返回一个随机键。

  1. $r = array_rand($nums, 2);

在这种情况下,array_rand()函数返回两个随机键的数组。

  1. $ php randomize.php
  2. 4
  3. 2
  4. 19
  5. 13 19 4 3 17 11 20 16 10 9 8 14 15 12 18 2 6 5 1 7

这是randomize.php程序的示例输出。

PHP in_array函数

in_array()函数检查数组中是否有特定元素。

inarray.php

  1. <?php
  2. $names = [ "Jane", "Adriana", "Lucy", "Rebecca" ];
  3. if (in_array("Jane", $names)) {
  4. echo "Jane is in the array\n";
  5. } else {
  6. echo "Jane is not in the array\n";
  7. }
  8. if (in_array("Monica", $names)) {
  9. echo "Monica is in the array\n";
  10. } else {
  11. echo "Monica is not in the array\n";
  12. }

我们的脚本检查$names数组中是否为’Jane’和’Monica’。

  1. $ php inarray.php
  2. Jane is in the array
  3. Monica is not in the array

简中有简,但莫妮卡中没有。

PHP 数组键和值

PHP 数组是一个由键和值对组成的关联数组。

keysvalues.php

  1. <?php
  2. $domains = [ "sk" => "Slovakia", "de" => "Germany",
  3. "hu" => "Hungary", "ru" => "Russia" ];
  4. $keys = array_keys($domains);
  5. $values = array_values($domains);
  6. foreach ($keys as $key) {
  7. echo "$key ";
  8. }
  9. echo "\n";
  10. foreach ($values as $value) {
  11. echo "$value ";
  12. }
  13. echo "\n";

array_keys()函数返回数组的所有键。 array_values()函数返回数组的所有值。

  1. $ php keysvalues.php
  2. sk de hu ru
  3. Slovakia Germany Hungary Russia

第一行包含顶级域名。 这些是$domains数组的键。 第二行是相应国家的名称。 这些是数组的值。

PHP array_walk函数

array_walk()函数将用户定义的函数应用于数组的每个成员。

array_walk.php

  1. <?php
  2. $countries = [ "de" => "Germany", "sk" => "Slovakia",
  3. "us" => "United States", "ru" => "Russia",
  4. "hu" => "Hungaria", "pl" => "Poland" ];
  5. function show_values($value, $key) {
  6. echo "The $key stands for the $value\n";
  7. }
  8. array_walk($countries, 'show_values');

我们有一个$countries数组。 我们将show_values函数应用于数组的每个元素。 该函数仅打印每个元素的键和值。

  1. $ php array_walk.php
  2. The de stands for the Germany
  3. The sk stands for the Slovakia
  4. The us stands for the United States
  5. The ru stands for the Russia
  6. The hu stands for the Hungaria
  7. The pl stands for the Poland

这是array_walk()函数的输出。

在 PHP 教程的这一部分中,我们介绍了一些 PHP 数组函数。