PHP 信息分类筛选教程

本教程将教你如何使用 PHP 对信息(通常是数组中的数据)进行分类和筛选,这在处理商品列表、文章归档、用户数据等场景中非常常见。

php信息分类筛选教程
(图片来源网络,侵删)

我们将分为以下几个部分:

  1. 基础概念:理解分类和筛选的核心逻辑。
  2. 核心函数:介绍 PHP 中用于数组操作的关键函数。
  3. 实战案例:通过一个商品列表的例子,完整演示分类和筛选的实现。
  4. 进阶技巧:处理更复杂的筛选条件。
  5. 总结与最佳实践

基础概念

在 PHP 中,我们通常将信息存储在关联数组对象数组中,一个商品列表可能如下:

$products = [
    [
        'id' => 1,
        'name' => 'iPhone 15',
        'category' => '手机',
        'price' => 5999,
        'in_stock' => true
    ],
    [
        'id' => 2,
        'name' => 'MacBook Pro',
        'category' => '电脑',
        'price' => 12999,
        'in_stock' => true
    ],
    [
        'id' => 3,
        'name' => 'AirPods Pro',
        'category' => '耳机',
        'price' => 1999,
        'in_stock' => false
    ],
    [
        'id' => 4,
        'name' => '小米手机',
        'category' => '手机',
        'price' => 2999,
        'in_stock' => true
    ]
];
  • 分类:将数据按照某个字段(如 category)进行分组,将所有“手机”归为一类,“电脑”归为另一类。
  • 筛选:根据一个或多个条件(如 price > 5000in_stock == true)从数据中提取出符合要求的部分。

核心 PHP 函数

我们将主要使用以下 PHP 函数来完成我们的任务。

筛选相关函数

  1. array_filter(array $array, callable $callback, int $flag = 0): array

    php信息分类筛选教程
    (图片来源网络,侵删)
    • 作用:使用用户自定义的函数(回调)来过滤数组中的元素。
    • 如何工作array_filter 会遍历 $array 中的每一个元素,并将其传递给 $callback 函数。$callback 返回 true,则该元素会被保留在结果数组中。
    • 示例:筛选出所有有货的商品。
    // 回调函数,检查商品是否有货
    function isInStock($product) {
        return $product['in_stock'];
    }
    $inStockProducts = array_filter($products, 'isInStock');
  2. array_column(array $array, mixed $column_key, mixed $index_key = null): array

    • 作用:从多维数组中取出指定列的值。
    • 如何工作:它非常适合在筛选后提取特定信息。
    • 示例:获取所有有货商品的名称。
    // 假设 $inStockProducts 已经通过 array_filter 获取
    $inStockProductNames = array_column($inStockProducts, 'name');
    // 结果: ['iPhone 15', 'MacBook Pro', '小米手机']

分类相关函数

  1. array_reduce(array $array, callable $callback, mixed $initial = null): mixed

    • 作用:将数组中的值依次归并为一个单一的值。
    • 如何工作:非常适合用来将一个数组“分类”或“分组”成一个新的关联数组,它会遍历原数组,并将每个元素累加到 $initial(初始值)上。
    • 示例:按 category 对商品进行分类。
    // 回调函数,用于构建分类数组
    function groupByCategory($carry, $product) {
        $category = $product['category'];
        // 如果该分类还不存在,则初始化一个空数组
        if (!isset($carry[$category])) {
            $carry[$category] = [];
        }
        // 将当前商品添加到对应的分类中
        $carry[$category][] = $product;
        return $carry;
    }
    $groupedProducts = array_reduce($products, 'groupByCategory', []);
  2. array_group_by(array $array, callable|string $key): array

    • 注意:这是一个在 PHP 8.1 中新增的函数,非常强大和直观。
    • 作用:专门用于将数组按指定键进行分组。
    • 如何工作:比 array_reduce 更简洁,可读性更高。
    • 示例:按 category 对商品进行分类(PHP 8.1+)。
    // 直接按 'category' 字段进行分组
    $groupedProducts = array_group_by($products, 'category');

实战案例:商品列表筛选与分类

假设我们要实现一个电商网站的商品展示页面,用户可以:

php信息分类筛选教程
(图片来源网络,侵删)
  1. 查看所有商品。
  2. 按分类(手机、电脑、耳机)筛选。
  3. 按价格范围筛选(只看 5000 元以上的商品)。
  4. 组合筛选(查看“手机”分类中“有货”的商品)。

步骤 1:准备数据

使用我们前面定义的 $products 数组。

步骤 2:创建筛选函数

为了代码清晰,我们将筛选逻辑封装成一个函数。

<?php
// 商品数据
$products = [
    // ... (同上) ...
];
/**
 * 根据条件筛选商品
 * @param array $products 原始商品数组
 * @param string|null $category 要筛选的分类
 * @param float|null $minPrice 最低价格
 * @param float|null $maxPrice 最高价格
 * @param bool|null $inStock 是否只看有货的
 * @return array 筛选后的商品数组
 */
function filterProducts(array $products, ?string $category = null, ?float $minPrice = null, ?float $maxPrice = null, ?bool $inStock = null): array
{
    return array_filter($products, function ($product) use ($category, $minPrice, $maxPrice, $inStock) {
        // 分类筛选
        if ($category !== null && $product['category'] !== $category) {
            return false;
        }
        // 最低价格筛选
        if ($minPrice !== null && $product['price'] < $minPrice) {
            return false;
        }
        // 最高价格筛选
        if ($maxPrice !== null && $product['price'] > $maxPrice) {
            return false;
        }
        // 库存筛选
        if ($inStock !== null && $product['in_stock'] !== $inStock) {
            return false;
        }
        // 如果所有条件都通过,则保留该商品
        return true;
    });
}

说明

  • array_filter 的回调函数使用了 use 关键字来访问外部变量($category, $minPrice 等)。
  • 我们对每个条件进行检查,如果任何一个条件不满足,就返回 false,表示该商品应被过滤掉。
  • 只有当所有条件都满足(或者没有设置任何筛选条件)时,才返回 true

步骤 3:使用筛选函数

我们可以根据不同的用户请求来调用这个函数。

// 场景 1: 获取所有商品
$allProducts = filterProducts($products);
// 场景 2: 只获取“手机”分类的商品
$phoneProducts = filterProducts($products, category: '手机');
// 场景 3: 只获取价格在 3000 到 6000 之间的商品
$priceRangeProducts = filterProducts($products, minPrice: 3000, maxPrice: 6000);
// 场景 4: 获取所有有货的商品
$availableProducts = filterProducts($products, inStock: true);
// 场景 5: 组合筛选 - 获取“手机”分类中价格低于 5000 且有货的商品
$filteredProducts = filterProducts($products, category: '手机', maxPrice: 5000, inStock: true);
// 打印结果看看
echo "<h3>所有商品:</h3>";
print_r($allProducts);
echo "<h3>手机分类:</h3>";
print_r($phoneProducts);
echo "<h3>组合筛选结果:</h3>";
print_r($filteredProducts);

步骤 4:对筛选后的结果进行分类

假设我们想展示“所有有货的商品”,并按分类组织它们。

// 1. 先筛选出有货的商品
$availableProducts = filterProducts($products, inStock: true);
// 2. 将这些有货的商品按分类进行分组
// 如果使用 PHP 8.1+
$groupedAvailableProducts = array_group_by($availableProducts, 'category');
// 如果使用 PHP 8.0 或更低版本
$groupedAvailableProducts = array_reduce($availableProducts, function ($carry, $product) {
    $category = $product['category'];
    if (!isset($carry[$category])) {
        $carry[$category] = [];
    }
    $carry[$category][] = $product;
    return $carry;
}, []);
// 打印分类后的结果
echo "<h3>按分类展示有货的商品:</h3>";
print_r($groupedAvailableProducts);

进阶技巧

动态构建筛选条件

在实际应用中,筛选条件通常来自 HTML 表单的 GET 请求。

/products.php?category=手机&max_price=5000&in_stock=1

我们可以轻松地获取这些参数并传递给我们的筛选函数。

// 从 $_GET 获取筛选参数,并设置默认值为 null
$category = $_GET['category'] ?? null;
$maxPrice = isset($_GET['max_price']) ? (float)$_GET['max_price'] : null;
$inStock = isset($_GET['in_stock']) ? (bool)$_GET['in_stock'] : null;
// 调用筛选函数
$finalResults = filterProducts($products, category: $category, maxPrice: $maxPrice, inStock: $inStock);
// 然后就可以在页面上显示 $finalResults 了

使用 usort 进行排序

筛选后,你可能还想对结果进行排序,例如按价格从低到高。

// 对筛选后的结果按价格升序排序
usort($finalResults, function ($a, $b) {
    return $a['price'] <=> $b['price']; // 太空船运算符,简洁明了
});
// 现在的 $finalResults 已经是按价格排好序的了

总结与最佳实践

  1. 数据结构是关键:确保你的数据存储在结构良好的数组中,最好是关联数组。
  2. 函数封装:将复杂的筛选逻辑封装成独立的函数(如 filterProducts),这会使你的代码更易于维护、测试和重用。
  3. 善用 array_filter:它是 PHP 中进行数据筛选最核心、最灵活的工具。
  4. 优先使用 array_group_by:如果你使用的是 PHP 8.1 或更高版本,array_group_by 是分类分组的最佳选择,代码更清晰。
  5. 处理外部输入:永远不要信任来自用户(如表单、URL)的数据,在用于筛选前,进行类型转换和验证(如 (float)$_GET['price'])。
  6. 性能考虑:对于非常大的数据集(数万条以上),纯 PHP 的数组操作可能会成为性能瓶颈,此时应考虑使用数据库的 WHEREGROUP BY 子句在数据源头进行筛选和分类,这会高效得多,本教程主要关注 PHP 层面的实现。

通过以上步骤和技巧,你就可以在 PHP 中灵活地实现各种复杂的信息分类和筛选功能了。