第5章:数组

数组是PHP中最重要的数据结构之一,它允许我们在一个变量中存储多个值。掌握数组的使用对于PHP编程至关重要,因为数组在Web开发中无处不在,从处理表单数据到数据库结果,从配置文件到复杂数据结构,都离不开数组的应用。

学习目标

通过本章的学习,你将掌握:

  • 理解数组的概念和重要性
  • 掌握索引数组的创建和使用
  • 熟练运用关联数组处理键值对数据
  • 理解和使用多维数组处理复杂数据结构
  • 掌握常用的数组函数进行数据处理
  • 能够在实际项目中灵活运用各种数组操作

本章内容

  1. 索引数组 - 使用数字索引的数组
  2. 关联数组 - 使用字符串键的数组
  3. 多维数组 - 包含其他数组的数组
  4. 常用数组函数 - 内置数组函数详解

为什么数组如此重要?

1. 数据组织的核心

数组是组织和管理数据的理想工具。想象一下,你需要管理一个学生名单:

// 不使用数组,需要为每个学生创建单独的变量
$student1 = "张三";
$student2 = "李四";
$student3 = "王五";
// ... 如果有100个学生怎么办?

// 使用数组,一个变量就能存储所有学生
$students = ["张三", "李四", "王五", "赵六", "钱七"];

2. Web开发的基础

在Web开发中,数组无处不在:

  • 表单数据处理:用户提交的多个选项
  • 数据库查询结果:从数据库获取的多条记录
  • 配置管理:应用的配置选项
  • 会话数据:用户会话中存储的信息

3. 算法实现的基础

许多算法都基于数组实现:

  • 排序算法
  • 搜索算法
  • 数据结构(栈、队列等)

PHP数组的特点

1. 灵活性

PHP数组非常灵活,可以:

  • 存储不同类型的值
  • 动态调整大小
  • 同时使用数字和字符串作为键
$mixedArray = [
    42,                           // 整数
    "Hello",                      // 字符串
    3.14,                         // 浮点数
    true,                         // 布尔值
    ["nested" => "array"]         // 数组
];

2. 高性能

PHP的数组实现(哈希表)提供了优秀的性能:

  • 快速的查找:O(1)平均时间复杂度
  • 高效的插入和删除
  • 内存使用优化

3. 丰富的内置函数

PHP提供了超过80个内置数组函数,涵盖了:

  • 排序和搜索
  • 过滤和映射
  • 合并和拆分
  • 统计和计算

实际应用示例:电商购物车系统

让我们通过一个完整的购物车系统示例来展示数组的强大功能:

<?php
// 购物车类 - 展示数组的综合应用
class ShoppingCart {
    // 购物车商品数组 - 关联数组
    private $items = [];

    // 商品信息数组 - 多维数组
    private $products = [
        101 => [
            'name' => 'iPhone 15',
            'price' => 5999,
            'stock' => 50,
            'category' => '手机'
        ],
        102 => [
            'name' => 'MacBook Pro',
            'price' => 14999,
            'stock' => 20,
            'category' => '笔记本'
        ],
        103 => [
            'name' => 'AirPods Pro',
            'price' => 1999,
            'stock' => 100,
            'category' => '耳机'
        ]
    ];

    // 添加商品到购物车
    public function addItem($productId, $quantity = 1) {
        // 检查商品是否存在
        if (!isset($this->products[$productId])) {
            throw new Exception("商品不存在");
        }

        // 检查库存
        if ($this->products[$productId]['stock'] < $quantity) {
            throw new Exception("库存不足");
        }

        // 添加到购物车 - 使用商品ID作为键
        if (isset($this->items[$productId])) {
            $this->items[$productId]['quantity'] += $quantity;
        } else {
            $this->items[$productId] = [
                'name' => $this->products[$productId]['name'],
                'price' => $this->products[$productId]['price'],
                'quantity' => $quantity,
                'subtotal' => $this->products[$productId]['price'] * $quantity
            ];
        }
    }

    // 移除商品
    public function removeItem($productId) {
        if (isset($this->items[$productId])) {
            unset($this->items[$productId]);
        }
    }

    // 更新商品数量
    public function updateQuantity($productId, $quantity) {
        if (isset($this->items[$productId]) && $quantity > 0) {
            $this->items[$productId]['quantity'] = $quantity;
            $this->items[$productId]['subtotal'] =
                $this->items[$productId]['price'] * $quantity;
        }
    }

    // 获取购物车总价
    public function getTotal() {
        $total = 0;
        foreach ($this->items as $item) {
            $total += $item['subtotal'];
        }
        return $total;
    }

    // 获取购物车商品数量
    public function getItemCount() {
        return count($this->items);
    }

    // 按分类统计商品
    public function getStatsByCategory() {
        $categoryStats = [];

        foreach ($this->items as $productId => $item) {
            $category = $this->products[$productId]['category'];

            if (!isset($categoryStats[$category])) {
                $categoryStats[$category] = [
                    'count' => 0,
                    'total' => 0
                ];
            }

            $categoryStats[$category]['count']++;
            $categoryStats[$category]['total'] += $item['subtotal'];
        }

        return $categoryStats;
    }

    // 获取购物车详情
    public function getCartDetails() {
        return [
            'items' => $this->items,
            'item_count' => $this->getItemCount(),
            'total_amount' => $this->getTotal(),
            'category_stats' => $this->getStatsByCategory()
        ];
    }

    // 清空购物车
    public function clear() {
        $this->items = [];
    }
}

// 使用示例
try {
    $cart = new ShoppingCart();

    // 添加商品
    $cart->addItem(101, 1);        // iPhone 15 x1
    $cart->addItem(103, 2);        // AirPods Pro x2
    $cart->addItem(102, 1);        // MacBook Pro x1

    // 获取购物车详情
    $details = $cart->getCartDetails();

    echo "=== 购物车详情 ===\n";
    echo "商品数量:{$details['item_count']} 种\n";
    echo "总价:¥{$details['total_amount']}\n\n";

    echo "商品列表:\n";
    foreach ($details['items'] as $productId => $item) {
        echo "- {$item['name']} x{$item['quantity']} = ¥{$item['subtotal']}\n";
    }

    echo "\n分类统计:\n";
    foreach ($details['category_stats'] as $category => $stats) {
        echo "- {$category}:{$stats['count']} 件,¥{$stats['total']}\n";
    }

} catch (Exception $e) {
    echo "错误:" . $e->getMessage();
}
?>

这个购物车系统展示了数组的多个重要应用:

  1. 关联数组:存储商品信息和购物车项目
  2. 多维数组:复杂的商品数据结构
  3. 数组函数:count(), foreach循环等
  4. 动态操作:添加、删除、更新数组元素
  5. 数据统计:基于数组的分组和计算

学习建议

循序渐进

  1. 先掌握基础:从索引数组开始,理解数组的基本概念
  2. 逐步深入:学习关联数组,理解键值对的概念
  3. 实践应用:通过多维数组处理复杂数据结构
  4. 函数运用:掌握常用数组函数,提高开发效率

动手实践

  • 每个概念都要编写代码验证
  • 尝试用数组解决实际问题
  • 分析优秀的PHP代码中的数组使用
  • 练习数组函数的各种组合用法

性能考虑

  • 了解数组的时间复杂度
  • 选择合适的数组类型
  • 避免不必要的数组操作
  • 利用内置函数的优化

下一步

现在你已经了解了数组的重要性和基本概念,让我们开始详细学习各种数组类型:

  1. 索引数组 - 学习最基础的数组类型
  2. 关联数组 - 掌握键值对的使用
  3. 多维数组 - 处理复杂的数据结构
  4. 常用数组函数 - 提高开发效率

记住,数组是PHP编程的基础,掌握好数组将让你的PHP编程之路更加顺畅!