0

0

PHP 数组分区算法实现

舞夢輝影

舞夢輝影

发布时间:2026-03-11 21:04:04

|

353人浏览过

|

来源于php中文网

原创

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

php 数组分区算法实现

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 更高效(单次遍历)。

I-Shop购物系统
I-Shop购物系统

部分功能简介:商品收藏夹功能热门商品最新商品分级价格功能自选风格打印结算页面内部短信箱商品评论增加上一商品,下一商品功能增强商家提示功能友情链接用户在线统计用户来访统计用户来访信息用户积分功能广告设置用户组分类邮件系统后台实现更新用户数据系统图片设置模板管理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 时慎用 == 判断,应引入精度容差

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

266

2025.12.04

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1566

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

649

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1228

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1184

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

192

2025.07.29

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.3万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号