PHP array() 函数详解

array() 函数是PHP中用于创建数组的核心函数。数组是PHP中最重要的数据结构之一,用于存储多个值在一个变量中。掌握array()函数的使用是PHP编程的基础。

学习要点: 本章将详细介绍array()函数的用法,包括三种数组类型的创建方法、短数组语法、数组操作技巧以及实际应用案例。

数组类型概述

在PHP中,数组是一种强大的数据结构,可以存储多个值。PHP支持三种主要类型的数组:

  • 数值数组 - 带有数字ID键的数组,键从0开始自动分配
  • 关联数组 - 带有自定义字符串键的数组,每个键关联一个值
  • 多维数组 - 包含一个或多个数组的数组,用于存储复杂数据结构

array() 函数语法

基本语法

array(value1, value2, value3, ...);

短数组语法 (PHP 5.4+)

[value1, value2, value3, ...];

提示: 自PHP 5.4起,可以使用短数组语法 [] 代替 array(),这使代码更简洁易读。

数值数组

数值数组是最基本的数组类型,使用数字作为键,键值从0开始自动分配。

创建数值数组

<?php
// 使用 array() 函数创建数值数组
$fruits = array("苹果", "香蕉", "橙子", "芒果");
echo $fruits[0] . ", " . $fruits[1] . ", " . $fruits[2] . ", " . $fruits[3];
// 输出: 苹果, 香蕉, 橙子, 芒果

// 使用短数组语法创建数值数组
$colors = ["红色", "绿色", "蓝色"];
echo $colors[0] . ", " . $colors[1] . ", " . $colors[2];
// 输出: 红色, 绿色, 蓝色

// 逐个添加元素
$numbers = array();
$numbers[0] = 10;
$numbers[1] = 20;
$numbers[2] = 30;
// 等同于: $numbers = [10, 20, 30];

// 使用自动索引
$autoIndex = array();
$autoIndex[] = "第一个元素";  // 索引 0
$autoIndex[] = "第二个元素";  // 索引 1
$autoIndex[] = "第三个元素";  // 索引 2

// 混合数据类型
$mixed = array(1, "文本", 3.14, true);
echo $mixed[0] . " - " . $mixed[1] . " - " . $mixed[2] . " - " . $mixed[3];
// 输出: 1 - 文本 - 3.14 - 1
?>

关联数组

关联数组使用自定义的字符串键来访问元素,适用于需要键值对数据的场景。

创建关联数组

<?php
// 使用 array() 函数创建关联数组
$person = array(
    "name" => "张三",
    "age" => 25,
    "city" => "北京"
);
echo $person["name"] . " - " . $person["age"] . " - " . $person["city"];
// 输出: 张三 - 25 - 北京

// 使用短数组语法创建关联数组
$car = [
    "brand" => "丰田",
    "model" => "凯美瑞",
    "year" => 2023
];
echo $car["brand"] . " " . $car["model"] . " (" . $car["year"] . ")";
// 输出: 丰田 凯美瑞 (2023)

// 逐个添加元素
$student = array();
$student["name"] = "李四";
$student["grade"] = "A";
$student["score"] = 95;

// 混合键类型 (不推荐,但PHP允许)
$mixedKeys = array(
    "name" => "王五",
    0 => "索引0的值",
    "1" => "字符串键1的值"
);
?>

关联数组实际应用

<?php
// 配置信息存储
$config = [
    "database" => [
        "host" => "localhost",
        "user" => "root",
        "password" => "123456",
        "dbname" => "myapp"
    ],
    "app" => [
        "name" => "我的应用",
        "version" => "1.0.0",
        "debug" => true
    ]
];

echo "数据库主机: " . $config["database"]["host"];
echo "应用名称: " . $config["app"]["name"];

// 表单数据处理
$formData = [
    "username" => "john_doe",
    "email" => "john@example.com",
    "password" => "secure_password",
    "remember_me" => true
];

// 多语言支持
$lang = [
    "welcome" => "欢迎访问我们的网站",
    "login" => "登录",
    "logout" => "退出",
    "search" => "搜索"
];

echo $lang["welcome"];
?>

多维数组

多维数组是包含一个或多个数组的数组,用于存储复杂的数据结构。

创建多维数组

<?php
// 二维数值数组
$matrix = array(
    array(1, 2, 3),
    array(4, 5, 6),
    array(7, 8, 9)
);
echo $matrix[0][1]; // 输出: 2
echo $matrix[1][2]; // 输出: 6

// 二维关联数组
$students = [
    [
        "name" => "张三",
        "age" => 20,
        "grades" => [85, 90, 78]
    ],
    [
        "name" => "李四",
        "age" => 22,
        "grades" => [92, 88, 95]
    ],
    [
        "name" => "王五",
        "age" => 21,
        "grades" => [76, 85, 80]
    ]
];

echo $students[0]["name"] . "的年龄是" . $students[0]["age"];
echo ",数学成绩:" . $students[0]["grades"][0];

// 更复杂的多维数组
$company = [
    "name" => "ABC科技有限公司",
    "departments" => [
        "development" => [
            "manager" => "张经理",
            "employees" => ["程序员A", "程序员B", "程序员C"]
        ],
        "sales" => [
            "manager" => "李经理",
            "employees" => ["销售A", "销售B"]
        ]
    ]
];

echo $company["departments"]["development"]["manager"];
echo $company["departments"]["sales"]["employees"][0];
?>

数组遍历

PHP提供了多种方式来遍历数组,每种方式适用于不同的场景。

遍历数组的方法

<?php
// 关联数组
$age = array("Peter" => "35", "Ben" => "37", "Joe" => "43");

// 1. foreach 循环 (最常用)
foreach($age as $name => $age_value) {
    echo "Key=" . $name . ", Value=" . $age_value;
    echo "<br>";
}

// 2. 只遍历值
foreach($age as $age_value) {
    echo "Age: " . $age_value . "<br>";
}

// 3. for 循环 (适用于数值数组)
$fruits = array("苹果", "香蕉", "橙子");
for($i = 0; $i < count($fruits); $i++) {
    echo $fruits[$i] . "<br>";
}

// 4. while + each + list (PHP 7.2+ 已废弃,了解即可)
// reset($age);
// while(list($name, $age_value) = each($age)) {
//     echo "$name is $age_value years old.<br>";
// }

// 5. 使用 array_walk 函数
function printItem($value, $key) {
    echo "$key: $value<br>";
}
array_walk($age, 'printItem');

// 遍历多维数组
$employees = [
    ["name" => "张三", "department" => "技术部"],
    ["name" => "李四", "department" => "销售部"],
    ["name" => "王五", "department" => "市场部"]
];

foreach($employees as $employee) {
    echo "姓名: " . $employee["name"] . ", 部门: " . $employee["department"] . "<br>";
}
?>

常用数组创建技巧

实用创建方法

<?php
// 1. 使用 range() 函数创建数值序列
$numbers = range(1, 10); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
$letters = range('a', 'e'); // ['a', 'b', 'c', 'd', 'e']

// 2. 使用 array_fill() 填充数组
$filled = array_fill(0, 5, 'default'); // [0=>'default', 1=>'default', ...]

// 3. 从字符串创建数组
$string = "apple,banana,orange";
$fruits = explode(",", $string); // ['apple', 'banana', 'orange']

// 4. 使用 compact() 从变量创建关联数组
$name = "张三";
$age = 25;
$city = "北京";
$person = compact('name', 'age', 'city');

// 5. 使用 array_combine() 合并键和值
$keys = ['name', 'age', 'city'];
$values = ['李四', 30, '上海'];
$combined = array_combine($keys, $values);

// 6. 快速创建配置数组
$config = array(
    'database.host' => 'localhost',
    'database.user' => 'root',
    'app.debug' => true,
    'app.name' => 'My App'
);

// 7. 使用 splat 操作符 (...) 合并数组 (PHP 5.6+)
$array1 = [1, 2, 3];
$array2 = [4, 5, 6];
$merged = [...$array1, ...$array2]; // [1, 2, 3, 4, 5, 6]
?>

实际应用案例

案例 1:用户数据管理

<?php
// 用户数据管理
$users = [
    [
        'id' => 1,
        'username' => 'john_doe',
        'email' => 'john@example.com',
        'profile' => [
            'firstName' => 'John',
            'lastName' => 'Doe',
            'age' => 28
        ],
        'preferences' => [
            'theme' => 'dark',
            'language' => 'zh-CN',
            'notifications' => true
        ]
    ],
    [
        'id' => 2,
        'username' => 'jane_smith',
        'email' => 'jane@example.com',
        'profile' => [
            'firstName' => 'Jane',
            'lastName' => 'Smith',
            'age' => 32
        ],
        'preferences' => [
            'theme' => 'light',
            'language' => 'en-US',
            'notifications' => false
        ]
    ]
];

// 查找特定用户
function findUserById($users, $id) {
    foreach($users as $user) {
        if($user['id'] === $id) {
            return $user;
        }
    }
    return null;
}

$user = findUserById($users, 1);
if($user) {
    echo "找到用户: " . $user['username'];
    echo ",邮箱: " . $user['email'];
    echo ",主题: " . $user['preferences']['theme'];
}
?>

案例 2:商品目录系统

<?php
// 商品目录系统
$products = [
    'electronics' => [
        [
            'id' => 'E001',
            'name' => '智能手机',
            'price' => 2999.00,
            'specs' => ['屏幕: 6.1英寸', '内存: 8GB', '存储: 128GB'],
            'inStock' => true
        ],
        [
            'id' => 'E002',
            'name' => '笔记本电脑',
            'price' => 5999.00,
            'specs' => ['CPU: i7', '内存: 16GB', '存储: 512GB SSD'],
            'inStock' => false
        ]
    ],
    'books' => [
        [
            'id' => 'B001',
            'name' => 'PHP编程指南',
            'price' => 89.00,
            'author' => '张教授',
            'inStock' => true
        ],
        [
            'id' => 'B002',
            'name' => 'Web开发实战',
            'price' => 76.00,
            'author' => '李专家',
            'inStock' => true
        ]
    ]
];

// 显示所有商品
foreach($products as $category => $items) {
    echo "<h3>" . ucfirst($category) . "</h3>";
    foreach($items as $product) {
        echo "商品ID: " . $product['id'] . "<br>";
        echo "名称: " . $product['name'] . "<br>";
        echo "价格: ¥" . number_format($product['price'], 2) . "<br>";
        echo "库存: " . ($product['inStock'] ? "有货" : "缺货") . "<br><br>";
    }
}

// 计算总商品数量
$totalProducts = 0;
foreach($products as $category => $items) {
    $totalProducts += count($items);
}
echo "总商品数量: " . $totalProducts;
?>

技术细节

返回值: 返回参数的数组。如果没有参数,则返回一个空数组。
PHP 版本: 4+
更新日志:
  • PHP 5.4 - 添加了短数组语法 []
  • PHP 5.6 - 支持使用 ... 操作符解包数组
  • PHP 7.1 - 支持在 list() 中指定键
  • PHP 7.4 - 添加了数组解包操作符的改进

最佳实践和注意事项

注意事项

  • 性能考虑: 非常大的数组可能影响性能,特别是在遍历和搜索时
  • 内存使用: 数组在PHP中比较消耗内存,注意内存限制
  • 键的类型: 数组键可以是整数或字符串,其他类型会被转换
  • 未定义键: 访问不存在的数组键会产生通知(Notice)

最佳实践

  • 优先使用短数组语法 [],代码更简洁
  • 对于关联数组,使用有意义的键名
  • 使用 isset()array_key_exists() 检查键是否存在
  • 对于大型数据集,考虑使用数据库而不是数组
  • 使用适当的数组函数来操作数组,避免不必要的循环

安全访问数组元素

<?php
$user = [
    'name' => '张三',
    'email' => 'zhangsan@example.com'
];

// 不安全的访问方式
// echo $user['age']; // 会产生 Notice: Undefined index

// 安全的访问方式
if(isset($user['age'])) {
    echo $user['age'];
} else {
    echo "年龄未设置";
}

// 使用空值合并运算符 (PHP 7+)
$age = $user['age'] ?? '未知';
echo "年龄: " . $age;

// 使用 array_key_exists()
if(array_key_exists('email', $user)) {
    echo "邮箱: " . $user['email'];
}

// 多层数组的安全访问
$config = [
    'database' => [
        'host' => 'localhost'
    ]
];

$host = $config['database']['host'] ?? '127.0.0.1';
$port = $config['database']['port'] ?? '3306';

echo "数据库连接: $host:$port";
?>

本章总结

  • array() 函数用于创建数组,是PHP中最常用的函数之一
  • PHP支持三种数组类型:数值数组、关联数组、多维数组
  • PHP 5.4起可以使用短数组语法 []
  • 数值数组使用数字键,从0开始自动分配
  • 关联数组使用自定义字符串键,适合键值对数据
  • 多维数组可以存储复杂的数据结构
  • 使用foreach循环是遍历数组最常用的方法
  • 遵循最佳实践可以创建更高效、更安全的数组代码