PHP数组分区主要有三类:1.快排风格三路划分,原地操作返回等于区边界;2.按条件函数分区,单次遍历拆分真假两组;3.按键/字段分组,适用于关联数组归类。

PHP 中实现数组分区(Partition)通常指将数组按某个条件或值划分为多个子数组,常见于快速排序的分区步骤、数据分组、条件筛选等场景。核心是根据一个“基准值”(pivot)把原数组分成小于、等于、大于三部分,或按其他逻辑规则切分。
基础分区:快排风格的三路划分
这是最典型的分区操作,用于快速排序的第一步。目标是将数组重排,使所有小于 pivot 的元素在左,等于的在中间,大于的在右,同时返回左右边界索引。
关键点:原地操作、时间复杂度 O(n)、不额外申请大内存。
示例代码:
立即学习“PHP免费学习笔记(深入)”;
function partition(&$arr, $low = 0, $high = null) {
if ($high === null) $high = count($arr) - 1;
if ($low >= $high) return [$low, $high];
<pre class="brush:php;toolbar:false;">$pivot = $arr[$low];
$lt = $low; // arr[low+1...lt] < pivot
$gt = $high; // arr[gt...high] > pivot
$i = $low + 1; // arr[lt+1...i-1] == pivot
while ($i <= $gt) {
if ($arr[$i] < $pivot) {
$arr[$i++] = $arr[$lt + 1];
$arr[$lt + 1] = $pivot;
$lt++;
} elseif ($arr[$i] > $pivot) {
$arr[$i] = $arr[$gt];
$arr[$gt] = $pivot;
$gt--;
} else {
$i++;
}
}
return [$lt, $gt]; // 返回等于区间的左右边界}
按条件函数分区:array_filter 的增强版
若只需按布尔逻辑把数组拆成“满足”和“不满足”两组,可用 array_partition 自定义函数,比多次调用 array_filter 更高效(单次遍历)。
部分功能简介:商品收藏夹功能热门商品最新商品分级价格功能自选风格打印结算页面内部短信箱商品评论增加上一商品,下一商品功能增强商家提示功能友情链接用户在线统计用户来访统计用户来访信息用户积分功能广告设置用户组分类邮件系统后台实现更新用户数据系统图片设置模板管理CSS风格管理申诉内容过滤功能用户注册过滤特征字符IP库管理及来访限制及管理压缩,恢复,备份数据库功能上传文件管理商品类别管理商品添加/修改/
- 接收数组和回调函数(返回 true/false)
- 一次循环完成分流,避免两次遍历开销
- 返回关联数组:['true' => [...], 'false' => [...]]
示例代码:
立即学习“PHP免费学习笔记(深入)”;
function array_partition($arr, callable $callback) {
$result = ['true' => [], 'false' => []];
foreach ($arr as $key => $value) {
$result[$callback($value) ? 'true' : 'false'][] = $value;
}
return $result;
}
<p>// 使用示例:分离奇偶数
$nums = [1, 2, 3, 4, 5, 6];
$parts = array_partition($nums, fn($x) => $x % 2 === 0);
// $parts['true'] → [2, 4, 6]
// $parts['false'] → [1, 3, 5]</p>按键或字段分组式分区(多维数组适用)
当处理关联数组(如数据库记录),常需按某个字段(如 'status'、'category')把数据归类到不同子数组中。这不是严格意义的“算法分区”,但属高频实用场景。
- 使用 array_reduce 或简单 foreach 实现,清晰易维护
- 支持嵌套字段访问(如 'user.city')可配合辅助函数解析
- 结果为以分组键为下标的多维数组
示例代码:
立即学习“PHP免费学习笔记(深入)”;
function group_by($arr, $key) {
$result = [];
foreach ($arr as $item) {
$groupKey = is_object($item)
? $item->$key
: ($item[$key] ?? 'undefined');
$result[$groupKey][] = $item;
}
return $result;
}
<p>// 示例:按 status 分组订单
$orders = [
['id'=>1, 'status'=>'pending'],
['id'=>2, 'status'=>'shipped'],
['id'=>3, 'status'=>'pending']
];
$grouped = group_by($orders, 'status');
// $grouped['pending'] → 两个 pending 订单</p>注意事项与性能提示
分区操作看似简单,但实际应用中容易踩坑:
- 修改原数组时注意传引用(&$arr),否则分区无效
- 对大数组做非原地分区(如生成新数组)要考虑内存占用,优先用生成器或流式处理
- 字符串比较需注意大小写和编码,建议统一用 strcasecmp 或 mb_* 函数
- 浮点数作 pivot 时慎用 == 判断,应引入精度容差










