PHP 数组操作实战:10 个高频场景的最优写法

分类:后端开发 时间:2026-02-24 浏览:1
1

一、PHP 数组基础回顾

PHP 数组是 “万能容器”,支持索引数组(数字下标)、关联数组(字符串下标)、多维数组:

// 索引数组
$nums = [1, 2, 3, 4];
// 关联数组
$user = ['name' => '张三', 'age' => 25];
// 多维数组
$students = [
    ['id' => 1, 'name' => '李四', 'score' => 90],
    ['id' => 2, 'name' => '王五', 'score' => 85]
];

二、10 个高频场景的最优写法

场景 1:数组去重
// 基础方法:array_unique()
$arr = [1, 2, 2, 3, 3, 3];
$uniqueArr = array_unique($arr); // 结果:[1,2,3]

// 高性能写法(大数据量):利用键名唯一性
$uniqueArr = array_keys(array_flip($arr));

对比:array_unique () 底层是排序 + 去重,大数据量下效率低于 array_flip ()。

场景 2:数组筛选
// 筛选分数≥85的学生
$students = [
    ['id' => 1, 'name' => '李四', 'score' => 90],
    ['id' => 2, 'name' => '王五', 'score' => 85],
    ['id' => 3, 'name' => '赵六', 'score' => 80]
];
$highScore = array_filter($students, function($item) {
    return $item['score'] >= 85;
});
print_r($highScore); // 输出前2条数据
场景 3:数组排序
$userScores = ['张三' => 88, '李四' => 95, '王五' => 80];
// 按值升序(保留键名)
asort($userScores); 
// 按键名降序
krsort($userScores);
// 自定义排序(多维数组按score降序)
usort($students, function($a, $b) {
    return $b['score'] - $a['score'];
});
场景 4:数组合并 / 拆分
// 合并:array_merge()(覆盖相同字符串键名)
$arr1 = ['a' => 1, 'b' => 2];
$arr2 = ['b' => 3, 'c' => 4];
$mergeArr = array_merge($arr1, $arr2); // 结果:['a'=>1, 'b'=>3, 'c'=>4]

// 拆分:array_chunk()(按长度拆分)
$nums = [1,2,3,4,5];
$chunkArr = array_chunk($nums, 2); // 结果:[[1,2],[3,4],[5]]
场景 5:数组取值(避免未定义索引报错)
$user = ['name' => '张三'];
// 安全取值:isset() + 三元运算符
$age = isset($user['age']) ? $user['age'] : 0;
// PHP7+简写
$age = $user['age'] ?? 0;
场景 6:数组转字符串 / 字符串转数组
// 数组转字符串
$arr = ['苹果', '香蕉', '橙子'];
$str = implode(',', $arr); // 结果:"苹果,香蕉,橙子"

// 字符串转数组
$newArr = explode(',', $str); // 还原为原数组
场景 7:获取数组最大值 / 最小值
$nums = [10, 5, 8, 15];
$max = max($nums); // 15
$min = min($nums); // 5

// 多维数组取最大值
$maxScore = max(array_column($students, 'score')); // 90
场景 8:数组遍历效率对比
$bigArr = range(1, 100000); // 生成10万条数据的数组

// 方式1:for循环(最快)
$start = microtime(true);
for ($i = 0; $i < count($bigArr); $i++) {
    $val = $bigArr[$i];
}
echo "for循环耗时:" . (microtime(true) - $start) . "秒\n";

// 方式2:foreach(次之,代码更简洁)
$start = microtime(true);
foreach ($bigArr as $val) {}
echo "foreach耗时:" . (microtime(true) - $start) . "秒\n";

// 方式3:while+each(最慢,不推荐)
$start = microtime(true);
reset($bigArr);
while (list($k, $v) = each($bigArr)) {}
echo "while+each耗时:" . (microtime(true) - $start) . "秒\n";

结论:大数据量优先用 for 循环,常规场景用 foreach(代码可读性更高)。

场景 9:数组键值互换
$arr = ['a' => 1, 'b' => 2];
$flipArr = array_flip($arr); // 结果:[1=>'a', 2=>'b']
场景 10:构建树形数组(无限分类)
// 原始分类数据
$categories = [
    ['id' => 1, 'name' => '电子产品', 'pid' => 0],
    ['id' => 2, 'name' => '手机', 'pid' => 1],
    ['id' => 3, 'name' => '笔记本', 'pid' => 1],
    ['id' => 4, 'name' => '苹果手机', 'pid' => 2]
];

// 递归构建树形结构
function buildTree($data, $pid = 0) {
    $tree = [];
    foreach ($data as $item) {
        if ($item['pid'] == $pid) {
            $item['children'] = buildTree($data, $item['id']);
            $tree[] = $item;
        }
    }
    return $tree;
}

$tree = buildTree($categories);
print_r($tree);

三、数组操作性能优化总结

  1. 避免在循环中调用count($arr),提前赋值给变量;

  2. 大数据量去重 / 查重优先用array_flip()而非array_unique()

  3. 多维数组取值优先用array_column(),避免嵌套循环。

文章链接:http://www.qwkf.cn//houduan/21.html
文章标题:PHP 数组操作实战:10 个高频场景的最优写法

相关阅读