大家好,我是小皮
在 PHP 开发里,咱们写得最多的可能就是数组操作了。
虽然 PHP 原生提供了 array_filter、array_search、in_array 这些老伙计,但说实话,每次用起来总觉得有点“硌手”。比如你想找数组里满足条件的最后一个元素,或者想验证某个值是否精确出现了两次,原生函数写起来要么得套好几层,要么就得自己写 foreach 循环。
前阵子我发现了一个叫 ArrayLookup 的轻量级库,用完之后真的直呼“真香”。今天就跟兄弟们安利一下这个工具。
为什么推荐 ArrayLookup?
简单来说,ArrayLookup 把我们常用的数组查找、验证逻辑给“语义化”了。
代码更直观:以前要写三四行的逻辑,现在一行静态调用就能看懂,甚至不用写注释。
不仅支持数组:它还支持 Traversable(比如生成器、集合对象),这在处理大数据流时非常有用。
功能精准:它把“查找”和“验证”分得很开。你想找“第一个”、想找“最后一个”、还是想统计“出现次数”,它都有专门的 API。
ArrayLookup 怎么用?
验证器,判断满足条件的次数
有时候我们不需要过滤整个数组,只是想验证一下数据出现的“频率”,这在业务校验里非常实用。
AtLeast 系列(至少出现几次)
useArrayLookup\AtLeast;$data = [1, 2, 3];// 验证是否“至少”出现过 1 次AtLeast::once($data, fn($v) => $v === 1); // true// 验证是否“至少”出现过 2 次(支持宽松比较)$data2 = [1, "1", 3];AtLeast::twice($data2, fn($v) => $v == 1); // true// 验证是否“至少”出现了 n 次(比如 3 次)$data3 = [false, null, 0];AtLeast::times($data3, fn($v) => !$v, 3); // true
Only 系列(精确匹配次数)
如果你想确保某个条件“不多不少”刚好成立几次,用 Only
useArrayLookup\Only;$data = [1, "1", 3];// 验证是否“精确”只出现了 1 次(如果用宽松匹配 ==,结果就是 false)Only::once($data, fn($v) => $v === 1); // true// 验证是否“精确”只出现了 2 次Only::twice($data, fn($v) => $v == 1); // true// 验证是否“精确”只出现了 n 次Only::times([false, null, 1], fn($v) => !$v, 2); // true
查找器 (Finder) 精准定位数据
这是我最喜欢的部分,它解决了很多原生函数的痛点,比如找“最后一个元素”。
查找第一个或最后一个
useArrayLookup\Finder;$data = [6, 7, 8, 9];// 查找第一个满足条件的Finder::first($data, fn($v) => $v > 5); // 返回 6// 查找最后一个满足条件的(原生 PHP 写起来很蛋疼,这个直接搞定)Finder::last($data, fn($v) => $v > 5); // 返回 9// 如果找不到,会优雅地返回 nullFinder::first($data, fn($v) => $v > 100); // null
获取键名或获取多行
// 获取满足条件的第一个元素的“键名”(传入第 3 个参数为 true)Finder::first($data, fn($v) => $v === 7, true); // 返回索引 1// 获取所有满足条件的行(还可以选择是否保留原始键名)Finder::rows($data, fn($v) => $v > 6, true); // [1 => 7, 2 => 8, 3 => 9]// 还可以限制获取的数量(limit)Finder::rows($data, fn($v) => $v >= 0, limit: 1); // [6]
数据分区 (Partition)
这个功能超级强大,能一次性把数组按条件分成“要的”和“不要的”:
$data = [1, 6, 3, 8, 4, 9];// 按是否大于 5 分成两拨[$matching, $notMatching] = Finder::partition($data, fn($v) => $v > 5);// $matching: [6, 8, 9]// $notMatching: [1, 3, 4]
收集器 (Collector) 链式处理
以前我们可能需要写一个 foreach 循环,里面套 if 过滤,最后再 trim 或者转换格式。现在可以用链式操作一气呵成:
useArrayLookup\Collector;$data = [" hello ", 123, " world "];// 以前的写法比较臃肿,现在:$newArray = Collector::setUp($data) ->when(fn($v) => is_string($v)) // 只要字符串 ->withLimit(2) // 只要前两个 ->withTransform(fn($v) => trim($v)) // 顺便去个空格 ->getResults();// 结果: ["hello", "world"]
最后总结
老实说,PHP 并不缺工具库,但像 ArrayLookup 这样专注、轻量且不花哨的库确实能切实提高我们的开发效率。它不需要你改变原本的代码架构,只需要在你觉得原生 array_ 函数写起来很别扭的时候,引入它,一行代码解决战斗。
好的工具不一定要大,但一定要好用。建议大家在下一个项目的 Composer 里把它加进去试试:
composer require samsonasik/array-lookup
相信我,一旦你习惯了 Finder::last() 的顺滑,你可能就再也不想回去写手动的数组倒序遍历了。好的工具都值得尝试,希望这个轻量级的小库能让大家的开发工作变得更加高效。
感谢大家阅读,个人观点仅供参考,欢迎在评论区发表不同观点。
欢迎关注、分享、点赞、收藏、在看,我是微信公众号「PHP驿站」作者小皮。