PHP 零基础教程

PHP 数组

在 PHP 中,数组(Arrays)是一种特殊的变量,它能够同时容纳多个值。它们允许你将一系列相关的数据集合存储和组织在一个单一的变量名下,这比为每一个小数据项单独声明一个变量要高效得多。

本章将详细讲解 PHP 中最主要的三种数组类型:索引数组(Indexed Arrays)、关联数组(Associative Arrays)以及多维数组(Multidimensional Arrays)。

1. 索引数组 (Indexed Arrays)

索引数组(有时也叫数字数组)使用数字索引来存储元素,默认情况下索引从 0 开始。每个元素都会被自动分配一个整数键(Key),允许你通过元素所在的位置来访问它们的值。

1.1 声明索引数组

在 PHP 中,你可以使用 array() 构造函数或者更简便的方括号 [] 语法来创建一个索引数组。

<?php
// 使用 array() 构造函数
$fruits_array_constructor = array("苹果", "香蕉", "樱桃");

// 使用简写的方括号语法(现代 PHP 开发中强烈推荐)
$fruits_shorthand = ["苹果", "香蕉", "樱桃"];

echo $fruits_shorthand[0]; // 输出:苹果
echo $fruits_shorthand[1]; // 输出:香蕉
echo $fruits_shorthand[2]; // 输出:樱桃
?>

你也可以先创建一个空数组,然后再往里面添加元素。如果你在添加元素时不指定键(索引),PHP 会自动分配下一个可用的整数索引。

<?php
$cars = []; // 声明一个空的索引数组

$cars[] = "沃尔沃";  // 自动分配索引 0
$cars[] = "宝马";    // 自动分配索引 1
$cars[] = "丰田";    // 自动分配索引 2

echo $cars[0]; // 输出:沃尔沃
echo $cars[1]; // 输出:宝马
?>

即使数字键不连续,你也可以显式地定义特定的数字键。

<?php
$numbers = [];
$numbers[0] = 10;
$numbers[2] = 20; // 跳过了索引 1
$numbers[3] = 30;

echo $numbers[0]; // 输出:10
echo $numbers[2]; // 输出:20
// echo $numbers[1]; // 尝试访问不存在的索引会导致“Undefined array key (未定义的数组键)”警告
?>

1.2 访问和修改索引数组中的元素

想要访问索引数组中的元素,你需要使用方括号,并在其中填入该元素的数字索引。

<?php
$colors = ["红色", "绿色", "蓝色"];

// 访问元素
echo "第一种颜色是:" . $colors[0] . "\n"; // 输出:第一种颜色是:红色

// 修改元素
$colors[1] = "黄色"; // 将“绿色”改为“黄色”
echo "现在第二种颜色是:" . $colors[1] . "\n"; // 输出:现在第二种颜色是:黄色

// 在数组末尾添加一个新元素
$colors[] = "紫色";
echo "新增的最后一种颜色是:" . $colors[3] . "\n"; // 输出:新增的最后一种颜色是:紫色
?>

1.3 统计数组元素个数

可以使用内置的 count() 函数来获取数组中元素的总数。

<?php
$items = ["桌子", "椅子", "显示器"];
echo "物品数量:" . count($items) . "\n"; // 输出:物品数量:3
?>

2. 关联数组 (Associative Arrays)

关联数组是 PHP 中极其基础且重要的数据结构。在这种数组中,每个元素都有一个由你命名的键(Key),而不是数字索引。这些键通常是字符串,它们提供了一种更具描述性、更容易理解的方式来访问对应的值。

2.1 声明关联数组

通过指定“键值对 (key-value pairs)”来定义关联数组。键和值之间使用 => 符号(通常称为“胖箭头”)分隔。

<?php
// 使用 array() 构造函数
$student_array_constructor = array(
    "name" => "爱丽丝",
    "age" => 22,
    "major" => "计算机科学"
);

// 使用简写的方括号语法(推荐)
$student_shorthand = [
    "name" => "鲍勃",
    "age" => 24,
    "major" => "电子工程"
];

echo $student_shorthand["name"]; // 输出:鲍勃
echo $student_shorthand["age"];  // 输出:24
?>

与索引数组一样,你也可以向一个空的关联数组中逐个添加键值对,或者更新已有的键值对。

<?php
$person = []; // 空的关联数组

$person["firstName"] = "简";
$person["lastName"] = "多伊";
$person["city"] = "纽约";

echo $person["firstName"]; // 输出:简

// 修改一个已存在的元素
$person["city"] = "洛杉矶";
echo $person["city"]; // 输出:洛杉矶
?>

2.2 实战案例:用户画像 (User Profile)

假设你需要存储一个用户的个人资料。关联数组是处理这种情况的理想选择,因为每一项信息(如用户名、邮箱、注册状态)都可以用一个清晰的、具有描述性的键来标识。

<?php
$userProfile = [
    "username" => "john_doe",
    "email" => "john.doe@example.com",
    "status" => "active",
    "lastLogin" => "2023-10-26 10:30:00"
];

echo "欢迎," . $userProfile["username"] . "!\n";
echo "你的邮箱是:" . $userProfile["email"] . "\n";
echo "你的账户状态是:" . $userProfile["status"] . "\n";

// 更新用户的最后登录时间
$userProfile["lastLogin"] = date("Y-m-d H:i:s"); // 更新为当前服务器时间
echo "你的最后登录时间是:" . $userProfile["lastLogin"] . "\n";
?>

3. 多维数组 (Multidimensional Arrays)

多维数组本质上就是包含一个或多个数组的数组。这种结构允许你以结构化的、类似表格的形式存储复杂的数据,就好比一个 Excel 电子表格。最常见的是二维数组(即数组里套着数组),但 PHP 支持三维甚至更多维度的数组。

3.1 声明多维数组

你可以把二维数组想象成行和列。在最外层数组中的每一个元素,其本身又是一个独立的数组(代表一“行”数据)。

<?php
// 一个代表矩阵的 2D 索引数组
$matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];

// 一个代表学生列表的 2D 关联数组
$students = [
    [
        "name" => "爱丽丝",
        "age" => 22,
        "major" => "CS"
    ],
    [
        "name" => "鲍勃",
        "age" => 24,
        "major" => "EE"
    ],
    [
        "name" => "查理",
        "age" => 23,
        "major" => "Math"
    ]
];
?>

3.2 访问多维数组中的元素

要访问多维数组中的元素,你需要使用多个连续的方括号。有多少个维度,就需要用多少个方括号,它们与数组的嵌套层级一一对应。

<?php
// ... 使用上面定义的 $matrix 和 $students 数组 ...

// 访问矩阵 (索引多维数组) 中的元素
echo $matrix[0][0]; // 输出:1 (第一行,第一列)
echo $matrix[1][2]; // 输出:6 (第二行,第三列)
echo $matrix[2][1]; // 输出:8 (第三行,第二列)

// 访问学生列表 (关联多维数组) 中的元素
echo $students[0]["name"];  // 输出:爱丽丝 (第一个学生的姓名)
echo $students[1]["major"]; // 输出:EE (第二个学生的专业)

// 修改嵌套数组中的元素
$students[0]["age"] = 23; // 把爱丽丝的年龄改成了 23
echo $students[0]["age"]; // 输出:23
?>

3.3 实战案例:商品目录 (Product Catalog)

多维数组非常适合用来管理一个商品目录,因为在这个目录中,每一个类别下都可能包含多个商品,而每个商品又有多个属性(如名称、价格、库存)。

<?php
$productCatalog = [
    "electronics" => [ // 电子产品类 (这是一个索引数组,里面装着多个关联数组)
        [
            "id" => "E001",
            "name" => "智能手机",
            "price" => 699.99,
            "stock" => 150
        ],
        [
            "id" => "E002",
            "name" => "笔记本电脑",
            "price" => 1299.00,
            "stock" => 75
        ]
    ],
    "books" => [ // 图书类
        [
            "id" => "B001",
            "name" => "PHP 基础教程",
            "price" => 29.99,
            "stock" => 200
        ],
        [
            "id" => "B002",
            "name" => "高级算法",
            "price" => 59.99,
            "stock" => 80
        ]
    ]
];

// 访问一个特定的商品信息
echo "第一个电子产品名称:" . $productCatalog["electronics"][0]["name"] . "\n"; // 输出:智能手机
echo "《高级算法》这本书的价格:$" . $productCatalog["books"][1]["price"] . "\n"; // 输出:$59.99

// 模拟售出一台智能手机,更新库存
$productCatalog["electronics"][0]["stock"] -= 1; 
echo "更新后的智能手机库存:" . $productCatalog["electronics"][0]["stock"] . "\n"; // 输出:149
?>

这个例子展示了一个混合使用的多维数组:顶层键("electronics", "books")是关联数组的分类名,它们的值则是索引数组;而这些索引数组内部,每一个具体的商品信息又是由一个关联数组构成的。