PHP 数组:从基础到实战的全面总结


数组是 PHP 中最灵活、最常用的数据结构之一,无论是存储简单列表、复杂关联数据,还是处理业务逻辑,它都能胜任。这篇文章会从数组的核心概念入手,梳理基础用法、进阶技巧和实战注意事项,帮你彻底搞懂 PHP 数组。

一、PHP 数组的核心概念:为什么它不一样?

和其他语言(如 Java、Python)的数组不同,PHP 数组本质是 **“有序映射”**—— 既可以像 “索引数组” 按数字下标取值,也能像 “关联数组” 用字符串当键名,甚至两种形式可以混合存在。

 

举个直观的例子:

 

php
 
 
 
 
 
// 混合数组:同时包含索引键(0、1)和关联键(name、age)
$user = [
    'name' => '张三',  // 关联键
    0 => '男',        // 索引键
    'age' => 28,
    1 => '程序员'     // 索引键
];
 

 

这种灵活性让 PHP 数组能轻松应对各种场景,比如存储表单数据、数据库查询结果等。

二、数组的基础操作:创建、访问与修改

1. 数组的创建方式

PHP 创建数组有两种常用语法,推荐用更简洁的 “短数组语法”(PHP 5.4 + 支持):

 

php
 
 
 
 
 
// 1. 短数组语法(推荐)
$fruit = ['苹果', '香蕉', '橙子'];  // 索引数组
$student = ['id' => 101, 'name' => '李四'];  // 关联数组

// 2. array()函数(兼容旧版本)
$color = array('red', 'green', 'blue');
$score = array('math' => 90, 'english' => 85);
 

2. 数组的访问与修改

通过 “键名” 访问数组元素,修改时直接赋值即可,不存在的键会自动新增:

 

php
 
 
 
 
 
$fruit = ['苹果', '香蕉', '橙子'];
echo $fruit[1];  // 输出:香蕉(索引数组按数字下标)

$student = ['id' => 101, 'name' => '李四'];
echo $student['name'];  // 输出:李四(关联数组按字符串键)

// 修改元素
$student['name'] = '王五';
// 新增元素(键不存在则自动添加)
$student['grade'] = '高三';
print_r($student); 
// 输出:Array ( [id] => 101 [name] => 王五 [grade] => 高三 )
 

 

⚠️ 注意:索引数组的下标默认从 0 开始,若手动指定下标,后续未指定的下标会从 “最大指定下标 + 1” 继续:

 

php
 
 
 
 
 
$num = [1 => '一', '二', '三'];
echo $num[2];  // 输出:二(下标从1+1=2开始)
 

三、必学的数组函数:效率提升关键

PHP 提供了大量数组函数,不用重复造轮子。这里按 “常用场景” 分类,整理最实用的 10 个函数:

1. 遍历数组:foreach、array_map

  • foreach:最常用的遍历方式,支持索引和关联数组:
    php
     
     
     
     
     
    $score = ['math' => 90, 'english' => 85, 'chinese' => 95];
    foreach ($score as $subject => $point) {
        echo "{$subject}{$point}分<br>";
    }
    
     
  • array_map:对数组每个元素执行函数(适合批量处理):
    php
     
     
     
     
     
    // 给每个分数加5分
    $add5 = function($v) { return $v + 5; };
    $newScore = array_map($add5, $score);
    print_r($newScore); // 输出:Array ( [math] => 95 [english] => 90 [chinese] => 100 )
    
     

2. 数组过滤与查找:array_filter、in_array

  • array_filter:按条件筛选元素(保留返回 true 的元素):
    php
     
     
     
     
     
    // 筛选出大于90的分数
    $highScore = array_filter($score, function($v) {
        return $v > 90;
    });
    print_r($highScore); // 输出:Array ( [chinese] => 95 )
    
     
  • in_array:判断元素是否在数组中(返回 bool):
    php
     
     
     
     
     
    echo in_array(85, $score) ? '存在' : '不存在'; // 输出:存在
    
     

3. 数组计算与合并:count、array_merge

  • count:统计数组元素个数(len 的替代):
    php
     
     
     
     
     
    echo count($score); // 输出:3
    
     
  • array_merge:合并多个数组(关联键冲突时,后面的覆盖前面的):
    php
     
     
     
     
     
    $a = ['a' => 1, 'b' => 2];
    $b = ['b' => 3, 'c' => 4];
    $merge = array_merge($a, $b);
    print_r($merge); // 输出:Array ( [a] => 1 [b] => 3 [c] => 4 )
    
     

四、实战避坑:这些问题要注意

1. 索引数组的 “隐形陷阱”

当索引数组和关联数组混合时,for循环可能出错(for只认数字下标),推荐用foreach遍历:

 

php
 
 
 
 
 
$mix = ['name' => '张三', 0 => '男', 'age' => 28];
// 错误:for循环会忽略关联键,只遍历0、1...但数组中没有1,会报Notice
for ($i=0; $i<count($mix); $i++) {
    echo $mix[$i]; // 输出:男 + Notice: Undefined offset: 1
}
// 正确:foreach会遍历所有键值对
foreach ($mix as $k => $v) {
    echo "{$k}{$v}<br>"; // 正常输出所有元素
}
 

2. 数组键的 “类型自动转换”

PHP 会自动转换数组键的类型,比如字符串键若能转成数字,会变成索引键:

 

php
 
 
 
 
 
$test = ['123' => '数字字符串', 123 => '纯数字'];
print_r($test); // 输出:Array ( [123] => 纯数字 )(后面的覆盖前面的)
 

3. 大数组的性能问题

如果数组元素超过 10 万,避免频繁使用array_merge(会重新分配内存),推荐用$arr += $arr2(关联键不覆盖,索引键保留原顺序):

 

php
 
 
 
 
 
$bigArr1 = range(1, 100000); // 10万个元素的数组
$bigArr2 = range(100001, 200000);
// 比array_merge更快
$bigArr = $bigArr1 + $bigArr2;
 

五、总结

PHP 数组的灵活性是它的核心优势,但也需要注意细节:

 

  1. 理解 “有序映射” 本质,区分索引和关联数组的使用场景;
  2. 熟练掌握foreacharray_maparray_filter等常用函数,减少重复代码;
  3. 避开键类型转换、大数组性能等陷阱,保证代码稳定高效。

 

无论是日常开发中的表单处理,还是复杂业务中的数据存储,用好数组都能让你的 PHP 代码更简洁、更高效。
发布时间 : 2025-09-04,阅读量:22
本文链接:https://upwqy.com/details/990.html
PHP 抽象设计模式:从概念到实践的全面解析 Redis 在 PHP 中并发锁的使用说明