如何按指定规则排序PHP数组并使用var_export()输出结果?
嘿,这个排序需求其实用PHP的自定义排序函数就能轻松搞定,我给你捋捋具体实现思路和代码:
完整实现代码
<?php $array = ['hello', 'internet', 'people']; usort($array, function($a, $b) { // 统计字符串中的元音字母数量(忽略大小写) $vowelCountA = preg_match_all('/[aeiou]/i', $a); $vowelCountB = preg_match_all('/[aeiou]/i', $b); // 规则1:优先按元音数量降序排列 if ($vowelCountA !== $vowelCountB) { return $vowelCountB - $vowelCountA; } // 规则2:元音数量相同时,按反转后的字符串字典序升序排列 $reversedA = strrev($a); $reversedB = strrev($b); return strcmp($reversedA, $reversedB); }); var_export($array); // 输出结果:array ( 0 => 'people', 1 => 'internet', 2 => 'hello', ) ?>
代码逻辑拆解
1. 核心函数:usort()
PHP的usort()是自定义排序的核心,它允许我们传入一个回调函数,自己定义两个元素的比较规则,完美适配这个多条件排序的需求。
2. 统计元音字母数量
我用preg_match_all('/[aeiou]/i', $str)来统计每个字符串里的元音数:
- 正则里的
[aeiou]匹配所有小写元音,i标记忽略大小写,确保大写元音也能被统计 - 比如
people有3个元音(e、o、e),internet也是3个(i、e、e),hello是2个(e、o)
3. 实现规则1:元音数量降序
比较两个元素的元音数量,返回$vowelCountB - $vowelCountA:
- 如果
$vowelCountA小于$vowelCountB,返回正数,usort会把$b排在$a前面,刚好实现降序 - 这样元音多的字符串会优先排在前面
4. 实现规则2:反转字符串后字典序升序
当两个字符串元音数量相同时:
- 用
strrev()把字符串反转,比如internet变成tenretni,people变成elpoep - 用
strcmp()比较反转后的字符串,这个函数返回负数表示第一个参数字典序更小,usort会把它排在前面,刚好实现升序 - 所以
elpoep比tenretni字典序小,people就排在internet前面,和预期结果一致
运行这段代码后,var_export()输出的结果完全符合你的预期~
内容的提问来源于stack exchange,提问作者Marta Pascal
相关产品推荐
相关产品推荐

