在本教程中,我将列出常见的 php 数组函数,以及使用示例和最佳实践。每个 PHP 开发人员都必须知道如何使用它们以及如何组合数组函数以使代码可读且简短。
此外,还有一个包含给定代码示例的演示文稿,因此您可以从相关链接下载它并将其展示给您的同事,以建立一个更强大的团队。
基础知识
创建数组有两种不同的方法。一种是用于 array() 将元素指定为键值对。另一种方法是将所有元素放入 []. 在使用密钥对创建关联数组时,您应该记住两点。
首先,密钥必须是唯一的。如果您尝试在一个数组中多次使用同一个键,PHP 将忽略除最后一个之外的所有其他键值对。其次,如果一个键被创建为浮点数、布尔值和整数的有效字符串表示,那么它将被强制转换为整数。
下面是几个在 PHP 中创建数组的示例:
$first = array(10, "Apple", 20, -18, "Monkey"); print_r($first); /* Array ( [0] => 10 [1] => Apple [2] => 20 [3] => -18 [4] => Monkey ) */ $second = [10, "Apple", 20, -18, "Monkey"]; print_r($second); /* Array ( [0] => 10 [1] => Apple [2] => 20 [3] => -18 [4] => Monkey ) */ $third = [10, 5 => "Apple", 2 => 20, -18, "Monkey"]; print_r($third); /* Array ( [0] => 10 [5] => Apple [2] => 20 [6] => -18 [7] => Monkey ) */
如您所见,在创建数组时使用其中一个array() 或 []等效。从 PHP 5.4 开始可以使用速记符号。
您也不需要为每个数组值指定一个键。如果省略,PHP 会将键设置为比指定的最大整数键多一。所有自动分配的键都将大于或等于 0。
使用键和值
让我们从使用数组键和值的基本函数开始。其中之一是 array_combine(),它使用一个数组作为键,另一个数组作为值来创建一个数组:
$keys = ['sky', 'grass', 'orange']; $values = ['blue', 'green', 'orange']; $array = array_combine($keys, $values); print_r($array); // Array // ( // [sky] => blue // [grass] => green // [orange] => orange // )
您应该知道该array_values()函数返回一个索引值数组, array_keys() 返回一个给定数组的键数组,并 array_flip() 与值交换键:
print_r(array_keys($array)); // ['sky', 'grass', 'orange'] print_r(array_values($array)); // ['blue', 'green', 'orange'] print_r(array_flip($array)); // Array // ( // [blue] => sky // [green] => grass // [orange] => orange // )
您可以检查数组是否包含特定值并使用该 array_search() 函数获取其第一个对应键。in_array() 如果您只想知道数组是否包含特定元素并且对其位置不感兴趣,也可以使用 。 当您要检查数组是否使用给定键时,请考虑使用该 函数。array_key_exists()
$values = ["Apples", "Bananas", "Mangoes", "100", "200"]; if(in_array(100, $values)) { echo '100 is one of the values'; } // 100 is one of the values if(in_array(200, $values) !== false) { echo '200 is not one of the values'; } // 200 is not one of the values $values = ["Apples", "Bananas", "Mangoes", "100", "200", 100]; echo array_search(100, $values); // 3 echo array_search(100, $values, true); // 5 $values = ["Apples" => 100, "Bananas" => 10, "Mangoes" => 45]; if(array_key_exists("Apples", $values)) { echo 'We have apples.'; } // We have apples.
如上面的示例所示,如果您不想要任何意外的结果,请确保使用严格的类型检查。
如果要查找数组中的多个元素,通常通过先用 翻转数组 array_flip() 然后使用 来检查它是否包含特定值会更快array_key_exists()。
让你的代码更短
该list()函数不是真正的函数,而是一种语言构造,旨在以简短的方式分配变量。例如,这是一个使用该 list() 函数的基本示例:
// define array $array = ['a', 'b', 'c']; // without list() $a = $array[0]; $b = $array[1]; $c = $array[2]; // with list() list($a, $b, $c) = $array;
这种结构与 preg_slit() or 之类的函数完美配合explode() 。此外,如果您不需要定义某些参数,则可以跳过它们:
$string = 'hello|wild|world'; list($hello, , $world) = explode('|', $string); echo("$hello, $world"); // hello, world
此外, list() 可以与 一起使用 foreach,这使得这种结构更好:
$arrays = [[1, 2], [3, 4], [5, 6]]; foreach ($arrays as list($a, $b)) { $c = $a + $b; echo($c . ', '); // 3, 7, 11, }
使用该 extract() 函数,您可以将关联数组导出到变量。对于数组的每个元素,将创建一个变量,其中键名和值作为元素的值:
$array = [ 'clothes' => 't-shirt', 'size' => 'medium', 'color' => 'blue', ]; extract($array); echo("$clothes $size $color"); // t-shirt medium blue
请注意, 如果您正在处理用户数据extract()(例如请求的结果),那么这 是不安全的,因此最好将此函数与标志 和 .EXTR_IF_EXISTSEXTR_PREFIX_ALL
与前一个函数相反的是 compact() 函数,它从变量中创建一个关联数组:
$clothes = 't-shirt'; $size = 'medium'; $color = 'blue'; $array = compact('clothes', 'size', 'color'); print_r($array); // Array // ( // [clothes] => t-shirt // [size] => medium // [color] => blue // )
过滤功能
数组过滤有一个很棒的功能,叫做 array_filter(). 将数组作为第一个参数传递,将匿名函数作为第二个参数传递。如果您想将此元素保留在数组中,并且 如果您不这样做,请true 在回调函数中返回 :false
$numbers = [20, -3, 50, -99, 55]; $positive = array_filter($numbers, function($number) { return $number > 0; }); print_r($positive); // [0 => 20, 2 => 50, 4 => 55]
有一种方法不仅可以按值进行过滤。您可以使用 ARRAY_FILTER_USE_KEY or ARRAY_FILTER_USE_BOTH 作为第三个参数将键或值和键都传递给回调函数。
此外,您可以 array_filter() 在没有回调的情况下调用以删除所有空值:
$numbers = [-1, 0, 1]; $not_empty = array_filter($numbers); print_r($not_empty); // [0 => -1, 2 => 1]
array_unique() 您只能使用该函数从数组中获取唯一值 。请注意,该函数将保留第一个唯一元素的键:
$array = [1, 1, 1, 1, 2, 2, 2, 3, 4, 5, 5]; $uniques = array_unique($array); print_r($uniques); // Array // ( // [0] => 1 // [4] => 2 // [7] => 3 // [8] => 4 // [9] => 5 // )
使用 array_column(),您可以从多维数组中获取列值列表,例如来自 sql 数据库的答案或来自csv文件的导入。只需传递一个数组和列名:
$array = [ ['id' => 1, 'title' => 'tree'], ['id' => 2, 'title' => 'sun'], ['id' => 3, 'title' => 'cloud'], ]; $ids = array_column($array, 'id'); print_r($ids); // [1, 2, 3]
从 PHP 7 开始, array_column() 它变得更加强大,因为它现在可以 处理对象数组。因此,使用一系列模型变得更加容易:
$cinemas = Cinema::find()->all(); $cinema_ids = array_column($cinemas, 'id'); // php7 forever!
穿过阵列
使用 array_map(),您可以对数组的每个元素应用回调。您可以传递函数名称或匿名函数以根据给定数组获取新数组:
$cities = ['Berlin', 'KYIV', 'Amsterdam', 'Riga']; $aliases = array_map('strtolower', $cities); print_r($aliases); // ['berlin', 'kyiv, 'amsterdam', 'riga'] $numbers = [1, -2, 3, -4, 5]; $squares = array_map(function($number) { return $number ** 2; }, $numbers); print_r($squares); // [1, 4, 9, 16, 25]
有一个神话,没有办法将数组的值和键传递给回调,但我们可以打破它:
$model = ['id' => 7, 'name'=>'James']; $callback = function($key, $value) { return "$key is $value"; }; $res = array_map($callback, array_keys($model), $model); print_r($res); // Array // ( // [0] => id is 7 // [1] => name is James // )
但这看起来很脏。最好改为使用 array_walk() 。此函数看起来与 相同 array_map(),但工作方式不同。首先,使用引用传递数组,因此 array_walk() 不会创建新数组,而是更改给定数组。因此,作为源数组,您可以使用回调中的引用传递数组值。数组键也可以轻松传递:
$fruits = [ 'banana' => 'yellow', 'apple' => 'green', 'orange' => 'orange', ]; array_walk($fruits, function(&$value, $key) { $value = "$key is $value"; }); print_r($fruits); // Array // ( // [banana] => banana is yellow // [apple] => apple is green // [orange] => orange is orange // )
加入阵列
在 PHP 中合并两个或多个数组的最佳方法是使用该 array_merge() 函数。数组项将被合并在一起,具有相同字符串键的值将被最后一个值覆盖:
$array1 = ['a' => 'a', 'b' => 'b', 'c' => 'c']; $array2 = ['a' => 'A', 'b' => 'B', 'D' => 'D']; $merge = array_merge($array1, $array2); print_r($merge); // Array // ( // [a] => A // [b] => B // [c] => c // [D] => D // )
要从另一个数组(或多个数组)中删除数组值,请使用 array_diff(). 要获取给定数组中存在的值,请使用 array_intersect(). 下面的例子将展示它是如何工作的:
$array1 = [1, 2, 3, 4]; $array2 = [3, 4, 5, 6]; $diff = array_diff($array1, $array2); print_r($diff); // [0 => 1, 1 => 2] $intersect = array_intersect($array1, $array2); print_r($intersect); // [2 => 3, 3 => 4]
使用数组值进行数学运算
用于 array_sum() 获取数组值的总和, array_product() 将它们相乘,或创建您自己的公式 array_reduce():
$numbers = [1, 2, 3, 4, 5]; echo(array_sum($numbers)); // 15 echo(array_product($numbers)); // 120 echo(array_reduce($numbers, function($carry, $item) { return $carry ? $carry / $item : 1; })); // 0.0083 = 1/2/3/4/5
要计算数组的所有值,请使用 array_count_values(). 它将给定数组的所有唯一值作为键,并将这些值的计数作为值:
$things = ['apple', 'apple', 'banana', 'tree', 'tree', 'tree']; $values = array_count_values($things); print_r($values); // Array // ( // [apple] => 2 // [banana] => 1 // [tree] => 3 // )
生成数组
要生成具有给定大小和相同值的数组,请使用 array_fill():
$bind = array_fill(0, 5, '?'); print_r($bind); // ['?', '?', '?', '?', '?']
要生成具有一系列键和值的数组,例如一天中的小时数或字母,请使用 range():
$letters = range('a', 'z'); print_r($letters); // ['a', 'b', ..., 'z'] $hours = range(0, 23); print_r($hours); // [0, 1, 2, ..., 23]
要获取数组的一部分(例如,仅前三个元素),请使用 array_slice():
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; $top = array_slice($numbers, 0, 3); print_r($top); // [1, 2, 3]
如果您想生成一个具有不同键和分配给每个键的相同值的关联数组,您可以简单地使用该 array_fill_keys() 函数。
$keys = ["Apples", "Bananas", "Mangoes"]; $fruit_count = array_fill_keys($keys, 100); print_r($fruit_count); /* Array ( [Apples] => 100 [Bananas] => 100 [Mangoes] => 100 ) */
排序数组
请记住,PHP 中的每个排序函数都通过引用处理数组, 成功 时返回true ,失败时返回false 。有一个名为 的基本排序函数 sort(),它按升序对值进行排序,而不保留键。排序函数可以在前面加上以下字母:
a , 排序保留键
k , 按键排序
r , 逆序/降序排序
u , 使用用户函数排序
您可以在下表中看到这些字母的组合:
一个 | ķ | r | 你 | |
一个 | asort() | arsort() | uasort() | |
ķ | ksort() | krsort() | ||
r | arsort() | krsort() | rsort() | |
你 | uasort() | usort() |
像老板一样组合数组函数
当你开始组合数组函数时,真正的魔法就开始了。以下是使用 and 仅在一行代码中修剪和删除空值的 array_filter() 方法 array_map():
$values = ['say ', ' bye', ' ', ' to', ' spaces ', ' ']; $words = array_filter(array_map('trim', $values)); print_r($words); // ['say', 'bye', 'to', 'spaces']
要从模型数组创建标题图的 id,我们可以使用 array_combine() 和 的组合array_column():
$models = [$model1, $model2, $model3]; $id_to_title = array_combine( array_column($models, 'id'), array_column($models, 'title') );
要获取数组的前三个值,我们可以使用 array_count_values()、 arsort()和 array_slice():
$letters = ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'd', 'd', 'd', 'd', 'd']; $values = array_count_values($letters); // get key to count array arsort($values); // sort descending preserving key $top = array_slice($values, 0, 3); // get top 3 print_r($top); // Array // ( // [d] => 5 // [a] => 4 // [b] => 2 // )
它易于使用 array_sum() 并 array_map() 可以计算几行中的订单总和:
$order = [ ['product_id' => 1, 'price' => 99, 'count' => 1], ['product_id' => 2, 'price' => 50, 'count' => 2], ['product_id' => 2, 'price' => 17, 'count' => 3], ]; $sum = array_sum(array_map(function($product_row) { return $product_row['price'] * $product_row['count']; }, $order)); print_r($sum); // 250
结论
如您所见,主要数组函数的知识可以使您的代码更短且更具可读性。当然,PHP 有更多的数组函数,甚至给定的函数也有许多变体可以使用额外的参数和标志,但我认为在本教程中,我们已经涵盖了每个 PHP 开发人员应该知道的基础知识。