PHP中需掌握的不是内置算法,而是如何用其语法实现算法思想;应先吃透sort()等内置函数的边界与陷阱,再手写快排等算法。

PHP 本身不是算法语言,它不内置排序、查找、图遍历等算法实现;你写的“算法”,实际是用 PHP 语法组织逻辑、操作数组或对象、调用内置函数来达成目标。真正要学的,不是“PHP 算法”,而是**在 PHP 环境中如何正确表达和落地常见算法思想**。
从 sort() 到手写快排:别跳过内置函数的边界
很多人一上来就抄快排、归并、DFS 模板,结果连 usort() 的回调参数顺序都搞反,或者误以为 array_unique() 能去重二维数组——它不能,只对一维值有效。
-
sort()改变原数组,asort()保留键名,ksort()按键排序——选错就打乱业务逻辑 -
array_search()找不到返回false,不是-1,直接跟0比会出错 -
in_array()默认松散比较,'0' == 0成立,查用户 ID 时可能误判,务必加第三个参数true - 二维数组排序必须用
usort()+ 匿名函数,array_column()可提前抽字段,但注意 PHP 5.5+ 才支持索引提取
递归写法容易爆栈,foreach 往往更稳
PHP 默认栈深度约 100 层(受 xdebug.max_nesting_level 或 zend_extension 限制),树形结构深了直接 Fatal error: Maximum function nesting level。
- 目录遍历优先用
RecursiveDirectoryIterator+RecursiveIteratorIterator,不是自己写递归 - 无限级分类展示,用“闭包表”或“路径枚举”比递归查询更可靠;真要递归,加深度计数器和阈值拦截
-
foreach遍历嵌套数组比for($i=0; $i<count> 快且安全——<code>count()在每次循环里重复执行,且$arr若被修改会导致长度变化
isset()、empty()、array_key_exists() 判空逻辑完全不同
算法里大量涉及条件分支,这三个函数行为差异直接影响流程走向,混用等于埋雷。
-
isset($arr['key']):检查键存在且值不为null;$arr['key'] = null时返回false -
empty($arr['key']):检查值为''、0、'0'、null、false、[]之一;$arr['key'] = 0也会被判定为空 -
array_key_exists('key', $arr):只看键是否存在,不管值是什么;$arr['key'] = null也返回true - 判断 API 返回数据是否含某字段,用
array_key_exists();判断字段是否有有效值,用isset()+ 类型校验(如is_string())
大数组操作性能敏感点:引用传参和 yield 不是可选项
处理几千条记录时,array_map() 返回新数组会吃双倍内存;foreach 中直接修改 $item 是复制,改不动原数组。
立即学习“PHP免费学习笔记(深入)”;
- 需原地修改大数组,用
foreach($arr as &$item)加引用,完事加unset($item)防止后续意外污染 - 生成海量数据(如分页导出),用
yield写生成器,避免一次性return array把内存撑爆 -
array_filter()保留键名,若需重排索引得套一层array_values();而array_reduce()更适合聚合统计,比循环累加清晰
usort() 回调里忘了 return,或是递归没设出口导致超时,又或是用 empty() 判数字 ID 是否为空,结果 0 用户永远登不进系统。这些细节不在算法导图里,但在每一行跑起来的代码里。



















