在本教程中,我将列出常见的PHP数组函数以及用法和最佳实践的示例。 每个PHP开发人员都必须知道如何使用它们以及如何组合数组函数以使代码易于阅读和简短。
另外,这里有一个带有给定代码示例的演示文稿,因此您可以从相关链接下载该演示文稿,并将其展示给您的同事以建立更强大的团队。
基础
让我们从使用数组键和值的基本功能开始。 其中之一是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
// )
使您的代码更短
函数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()
或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_EXISTS
和EXTR_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
或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]
排序数组
记住,PHP中的每个排序函数都可以通过引用与数组一起使用, 如果成功,则返回true ;如果失败,则返回false 。 有一个称为sort()的基本排序函数,它按升序对值进行排序而不保留键。 排序功能可以由以下字母开头:
- a ,排序保留键
- k ,按键排序
- r ,按倒序/降序排列
- u ,按用户功能排序
您可以在下表中看到这些字母的组合:
一个 | ķ | [R | ü | |
一个 | 各种各样的 | Arsort | uasort | |
ķ | 排序 | 克尔索特 | ||
[R | Arsort | 克尔索特 | 排序 | |
ü | uasort | 乌索尔 |
像老板一样组合数组函数
当您开始组合数组函数时,真正的魔力就开始了。 这是使用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开发人员都应该知道的基本知识。
请注意,我已经使用给定的示例创建了演示文稿,因此您可以从相关链接下载演示文稿,并将其展示给您的团队。
如果您有任何疑问,请随时在文章评论中询问。
翻译自: https://code.tutsplus.com/tutorials/working-with-php-arrays-in-the-right-way--cms-28606