php 数组高级函数

数组高级函数

PHP 中数组的高级函数可以优雅地解决不少问题 可惜 php.net 上面的文档实在是云里雾里,要理解很久(至少对初学者)

不如直接举个非常直白的栗子 最本能的遍历实现我们一般都通过 foreach 实现:

假设我们现在有一个文件名的数组

<?php
$filenames = [
  'man',
  'woman',
  '李凌飞',
];

但是这一堆文件可能有很多种存储格式 .sql, .md, .json, .xml …

假设现在的任务是读取 .json, 那么最本能地

<?php
function jsonFileNames() {
  $result = [];

  foreach($filenames as $filename) {
    $result[] = $filename. '.json';
  }

  return $result;
}

可以接受, 但是总是觉得怪怪的,好像没有那么优雅的样子 $result 出现了 3

俗话说的好

生命诚可贵,爱情价更高,若为装逼故,二者皆可抛

array_map

<?php
function jsonFileNames() {
  return array_map(function($file) {
    return $file . '.json';
  }, $filenames);
}

输出结果一模一样,但是没有了中间变量 result 这个小三,神清气爽 装逼成功

更进一步:

<?php
function returnFileNamesByType ($type) {
  return array_map(function($file) use ($type) {
    return "$file.$type";
  }, $filenames);
}

注意

<?php
$array1 = ['李凌飞', '他'];
$array2 = ['是', '需要'];
$array3 = ['单身狗', '女朋友'];
print_r (
  array_map(fucntion($value1, $valu2, $value3) {
    return $value1 . $value2 . $value3;
  }, $array1, $array2, $array3);
);
/* [
 *    ['李凌飞是单身狗'],
 *    ['他需要女朋友'],
 * ]
 */
<?php
$input = ['key' => 'value'];
array_map(function($key, $value) {

  echo $key . $value;
}, array_keys($input), $input)
// 'keyvalue'
<?php
$floats = [13.12, 12.11, 22.22];
$integers = array_map('intval', $floats);
// $integers = [13, 12, 22];

类似于 array_map, array_reduce 作为另外一个 数组高级函数,也可以非常优雅地解决一些问题

array_reduce

array_reduce 最典型的 usecase 是 计算 数组中的和

<?php
$raw = [1,2,3,4,5,];
array_reduce($raw, function($result, $value) {
  return $result += $value;
})
// 15

很简单,但是比较实用,同样的如果用古典的 foreach 就会有一些 $tmp 看起来没有那么美好

<?php
$raw = [1,2,3,4,5,];

$sum = 0;
foreach($raw as $value) {
  $sum += $value;
}
$sum;
// 15

相比出现3次 sum 这种中间量来说我个人还是更加喜欢 array_reduce 这种简洁的感觉

最后 array_reduce 的第三个参数是 $result 的初始值

<?php
$raw = [1,2,3,4,5,];

array_reduce($raw, function($result, $value) {
  $result[$value] = $value;

  return $result;
}, []);
// [1 => 1, 2 => 2, ... 5 => 5]

借助 array_reduce 我有时候还会嵌套一些 array_filter 的效果(其实因为太懒了没有改成 array_filter)

只要简单加些 if else ... array_reduce 就可以华丽变身成很好理解的 array_filter, (如果愿意,array_reduce 还可以达到 array_map 的效果)

这种灵活性让我挺爱用这个函数的,可以无痛将 array_reduce 转化成 foreach 还避免了中间量的尴尬

array_filter

这个函数最常用的情况是 过滤数组中的 null

<?php
$test = [null, null, 1, 2, null];

array_filter($test);

// [2 => 1, 4 => 2];

更加常见的使用是从一个单维数组里面挑出来符合条件的元素

<?php
$test [1,2,3,4,5];

array_filter($test, function($content) {
  return $content > 3;
});

// [4,5];

happy coding, may the code will always be with you~