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

(图片来源网络,侵删)
我们将分为以下几个部分:
- 基础概念:理解分类和筛选的核心逻辑。
- 核心函数:介绍 PHP 中用于数组操作的关键函数。
- 实战案例:通过一个商品列表的例子,完整演示分类和筛选的实现。
- 进阶技巧:处理更复杂的筛选条件。
- 总结与最佳实践。
基础概念
在 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 > 5000或in_stock == true)从数据中提取出符合要求的部分。
核心 PHP 函数
我们将主要使用以下 PHP 函数来完成我们的任务。
筛选相关函数
-
array_filter(array $array, callable $callback, int $flag = 0): array
(图片来源网络,侵删)- 作用:使用用户自定义的函数(回调)来过滤数组中的元素。
- 如何工作:
array_filter会遍历$array中的每一个元素,并将其传递给$callback函数。$callback返回true,则该元素会被保留在结果数组中。 - 示例:筛选出所有有货的商品。
// 回调函数,检查商品是否有货 function isInStock($product) { return $product['in_stock']; } $inStockProducts = array_filter($products, 'isInStock'); -
array_column(array $array, mixed $column_key, mixed $index_key = null): array- 作用:从多维数组中取出指定列的值。
- 如何工作:它非常适合在筛选后提取特定信息。
- 示例:获取所有有货商品的名称。
// 假设 $inStockProducts 已经通过 array_filter 获取 $inStockProductNames = array_column($inStockProducts, 'name'); // 结果: ['iPhone 15', 'MacBook Pro', '小米手机']
分类相关函数
-
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', []); -
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');
实战案例:商品列表筛选与分类
假设我们要实现一个电商网站的商品展示页面,用户可以:

(图片来源网络,侵删)
- 查看所有商品。
- 按分类(手机、电脑、耳机)筛选。
- 按价格范围筛选(只看 5000 元以上的商品)。
- 组合筛选(查看“手机”分类中“有货”的商品)。
步骤 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 已经是按价格排好序的了
总结与最佳实践
- 数据结构是关键:确保你的数据存储在结构良好的数组中,最好是关联数组。
- 函数封装:将复杂的筛选逻辑封装成独立的函数(如
filterProducts),这会使你的代码更易于维护、测试和重用。 - 善用
array_filter:它是 PHP 中进行数据筛选最核心、最灵活的工具。 - 优先使用
array_group_by:如果你使用的是 PHP 8.1 或更高版本,array_group_by是分类分组的最佳选择,代码更清晰。 - 处理外部输入:永远不要信任来自用户(如表单、URL)的数据,在用于筛选前,进行类型转换和验证(如
(float)$_GET['price'])。 - 性能考虑:对于非常大的数据集(数万条以上),纯 PHP 的数组操作可能会成为性能瓶颈,此时应考虑使用数据库的
WHERE和GROUP BY子句在数据源头进行筛选和分类,这会高效得多,本教程主要关注 PHP 层面的实现。
通过以上步骤和技巧,你就可以在 PHP 中灵活地实现各种复杂的信息分类和筛选功能了。
