PHP数组高级操作技巧详解PHP的数组太常用了但很多开发者只用到了它的一小部分功能。今天就把数组的高级操作技巧都拿出来说说。array_map是最常用的数组变换函数。它对数组的每个元素应用回调函数返回新数组。php$numbers [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];// 基础用法每个元素平方$squares array_map(fn($n) $n * $n, $numbers);print_r($squares);// 多数组输入$prices [100, 200, 300];$quantities [2, 3, 1];$totals array_map(fn($p, $q) $p * $q, $prices, $quantities);print_r($totals);// 处理关联数组$users [[name 张三, age 28],[name 李四, age 35],[name 王五, age 22],];$names array_map(fn($u) $u[name], $users);print_r($names);?array_filter用于过滤数组只保留满足条件的元素。php$numbers [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];// 过滤偶数$evens array_filter($numbers, fn($n) $n % 2 0);print_r($evens);// 过滤掉空值$data [php, , null, js, false, 0, go, []];$filtered array_filter($data, fn($v) $v ! $v ! null $v ! false);print_r(array_values($filtered));// 用ARRAY_FILTER_USE_KEY按键过滤$items [a 1, b 2, c 3, d 4];$filtered array_filter($items, fn($key) in_array($key, [a, c]), ARRAY_FILTER_USE_KEY);print_r($filtered);// 用ARRAY_FILTER_USE_BOTH同时过滤键和值$filtered2 array_filter($items, fn($v, $k) $v 2 $k ! d, ARRAY_FILTER_USE_BOTH);print_r($filtered2);?array_reduce把数组归约成单个值非常强大。php$numbers [1, 2, 3, 4, 5];$sum array_reduce($numbers, fn($carry, $n) $carry $n, 0);echo 求和: $sum\n;$product array_reduce($numbers, fn($carry, $n) $carry * $n, 1);echo 求积: $product\n;$max array_reduce($numbers, fn($carry, $n) $n $carry ? $n : $carry, PHP_INT_MIN);echo 最大值: $max\n;// 复杂数据归约$orders [[id 1, amount 100, status paid],[id 2, amount 250, status pending],[id 3, amount 80, status paid],[id 4, amount 450, status cancelled],];$totalPaid array_reduce($orders,fn($carry, $order) $order[status] paid ? $carry $order[amount] : $carry,0);echo 已支付总额: $totalPaid\n;// 分组统计$stats array_reduce($orders, function ($carry, $order) {$carry[$order[status]] ($carry[$order[status]] ?? 0) 1;return $carry;}, []);print_r($stats);?array_column从二维数组中提取一列非常实用。php$users [[id 1, name 张三, email zhangsantest.com, age 28],[id 2, name 李四, email lisitest.com, age 35],[id 3, name 王五, email wangwutest.com, age 22],];// 提取所有名字$names array_column($users, name);print_r($names);// 以id为键name为值$nameMap array_column($users, name, id);print_r($nameMap);// 从对象数组中提取属性$objects [(object)[id 1, name 商品A, price 100],(object)[id 2, name 商品B, price 200],];$prices array_column($objects, price);print_r($prices);?数组排序有好几种方式各有各的用途。php$numbers [3, 1, 4, 1, 5, 9, 2, 6, 5];sort($numbers); // 升序值排序键重置print_r($numbers);rsort($numbers); // 降序print_r($numbers);$ages [张三 28, 李四 35, 王五 22];asort($ages); // 按值排序保持键关联print_r($ages);ksort($ages); // 按键排序print_r($ages);arsort($ages); // 按值降序print_r($ages);// 自定义排序$items [[name 商品A, price 100, sales 50],[name 商品B, price 200, sales 30],[name 商品C, price 150, sales 80],];usort($items, fn($a, $b) $b[sales] $a[sales]);print_r($items);// 多字段排序usort($items, function ($a, $b) {// 先按销量降序销量相同按价格升序if ($a[sales] ! $b[sales]) {return $b[sales] $a[sales];}return $a[price] $b[price];});print_r($items);?array_chunk和array_slice是分段操作数组的好工具。php$numbers range(1, 25);// 分成每5个一组$chunks array_chunk($numbers, 5);print_r($chunks);// 取前10个$first10 array_slice($numbers, 0, 10);print_r($first10);// 从第5个开始取5个$middle5 array_slice($numbers, 4, 5);print_r($middle5);// 取最后5个$last5 array_slice($numbers, -5);print_r($last5);// 保留键名$data [a 1, b 2, c 3, d 4, e 5];$slice array_slice($data, 1, 3, true);print_r($slice);?数组的差集和交集运算在数据处理中也很有用。php$array1 [1, 2, 3, 4, 5, 6];$array2 [4, 5, 6, 7, 8, 9];// 交集$intersect array_intersect($array1, $array2);print_r($intersect);// 差集在array1但不在array2中$diff array_diff($array1, $array2);print_r($diff);// 关联数组的差集$user1 [name 张三, age 28, email atest.com];$user2 [name 张三, age 30, email btest.com];$changes array_diff_assoc($user1, $user2);print_r($changes);?PHP的数组函数有两百多个上面这些是最常用的。用好这些函数很多需要写循环的场景一行代码就搞定了。代码更简洁可读性也更好。建议多翻翻PHP手册的数组函数部分总有惊喜等着你。
PHP数组高级操作技巧详解
发布时间:2026/6/3 11:43:13
PHP数组高级操作技巧详解PHP的数组太常用了但很多开发者只用到了它的一小部分功能。今天就把数组的高级操作技巧都拿出来说说。array_map是最常用的数组变换函数。它对数组的每个元素应用回调函数返回新数组。php$numbers [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];// 基础用法每个元素平方$squares array_map(fn($n) $n * $n, $numbers);print_r($squares);// 多数组输入$prices [100, 200, 300];$quantities [2, 3, 1];$totals array_map(fn($p, $q) $p * $q, $prices, $quantities);print_r($totals);// 处理关联数组$users [[name 张三, age 28],[name 李四, age 35],[name 王五, age 22],];$names array_map(fn($u) $u[name], $users);print_r($names);?array_filter用于过滤数组只保留满足条件的元素。php$numbers [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];// 过滤偶数$evens array_filter($numbers, fn($n) $n % 2 0);print_r($evens);// 过滤掉空值$data [php, , null, js, false, 0, go, []];$filtered array_filter($data, fn($v) $v ! $v ! null $v ! false);print_r(array_values($filtered));// 用ARRAY_FILTER_USE_KEY按键过滤$items [a 1, b 2, c 3, d 4];$filtered array_filter($items, fn($key) in_array($key, [a, c]), ARRAY_FILTER_USE_KEY);print_r($filtered);// 用ARRAY_FILTER_USE_BOTH同时过滤键和值$filtered2 array_filter($items, fn($v, $k) $v 2 $k ! d, ARRAY_FILTER_USE_BOTH);print_r($filtered2);?array_reduce把数组归约成单个值非常强大。php$numbers [1, 2, 3, 4, 5];$sum array_reduce($numbers, fn($carry, $n) $carry $n, 0);echo 求和: $sum\n;$product array_reduce($numbers, fn($carry, $n) $carry * $n, 1);echo 求积: $product\n;$max array_reduce($numbers, fn($carry, $n) $n $carry ? $n : $carry, PHP_INT_MIN);echo 最大值: $max\n;// 复杂数据归约$orders [[id 1, amount 100, status paid],[id 2, amount 250, status pending],[id 3, amount 80, status paid],[id 4, amount 450, status cancelled],];$totalPaid array_reduce($orders,fn($carry, $order) $order[status] paid ? $carry $order[amount] : $carry,0);echo 已支付总额: $totalPaid\n;// 分组统计$stats array_reduce($orders, function ($carry, $order) {$carry[$order[status]] ($carry[$order[status]] ?? 0) 1;return $carry;}, []);print_r($stats);?array_column从二维数组中提取一列非常实用。php$users [[id 1, name 张三, email zhangsantest.com, age 28],[id 2, name 李四, email lisitest.com, age 35],[id 3, name 王五, email wangwutest.com, age 22],];// 提取所有名字$names array_column($users, name);print_r($names);// 以id为键name为值$nameMap array_column($users, name, id);print_r($nameMap);// 从对象数组中提取属性$objects [(object)[id 1, name 商品A, price 100],(object)[id 2, name 商品B, price 200],];$prices array_column($objects, price);print_r($prices);?数组排序有好几种方式各有各的用途。php$numbers [3, 1, 4, 1, 5, 9, 2, 6, 5];sort($numbers); // 升序值排序键重置print_r($numbers);rsort($numbers); // 降序print_r($numbers);$ages [张三 28, 李四 35, 王五 22];asort($ages); // 按值排序保持键关联print_r($ages);ksort($ages); // 按键排序print_r($ages);arsort($ages); // 按值降序print_r($ages);// 自定义排序$items [[name 商品A, price 100, sales 50],[name 商品B, price 200, sales 30],[name 商品C, price 150, sales 80],];usort($items, fn($a, $b) $b[sales] $a[sales]);print_r($items);// 多字段排序usort($items, function ($a, $b) {// 先按销量降序销量相同按价格升序if ($a[sales] ! $b[sales]) {return $b[sales] $a[sales];}return $a[price] $b[price];});print_r($items);?array_chunk和array_slice是分段操作数组的好工具。php$numbers range(1, 25);// 分成每5个一组$chunks array_chunk($numbers, 5);print_r($chunks);// 取前10个$first10 array_slice($numbers, 0, 10);print_r($first10);// 从第5个开始取5个$middle5 array_slice($numbers, 4, 5);print_r($middle5);// 取最后5个$last5 array_slice($numbers, -5);print_r($last5);// 保留键名$data [a 1, b 2, c 3, d 4, e 5];$slice array_slice($data, 1, 3, true);print_r($slice);?数组的差集和交集运算在数据处理中也很有用。php$array1 [1, 2, 3, 4, 5, 6];$array2 [4, 5, 6, 7, 8, 9];// 交集$intersect array_intersect($array1, $array2);print_r($intersect);// 差集在array1但不在array2中$diff array_diff($array1, $array2);print_r($diff);// 关联数组的差集$user1 [name 张三, age 28, email atest.com];$user2 [name 张三, age 30, email btest.com];$changes array_diff_assoc($user1, $user2);print_r($changes);?PHP的数组函数有两百多个上面这些是最常用的。用好这些函数很多需要写循环的场景一行代码就搞定了。代码更简洁可读性也更好。建议多翻翻PHP手册的数组函数部分总有惊喜等着你。