今天去一个小公司面试,给了几道题,好久没做题了。。。遇到一个很有意思的题。题目如下:
假设有这样的一个数组
$list = ['mongo' => 101, 'redis' => 123, 'memcache' => 99, 'postgresql' => 101];不使用系统函数对这个数组进行排序,相同的值则按照键排序。我看到这道题,我想可以先把键和值进行一个交换。然后先对键进行排序,然后再对新数组中的值进行排序。直接上代码:
function arrSort($arr) {
$newArr = [];
foreach($arr as $key => $val) {
if(isset($newArr[$val])) {
$newArr[$val] = array_merge((array) $key, (array) $newArr[$val]);
} else {
$newArr[$val] = $key;
}
}
$indexArr = array_keys($newArr);
bubbleSort($indexArr);
$res = [];
foreach ($indexArr as $_val) {
# code...
$res[$_val] = $newArr[$_val];
}
array_walk($res,'alphabetSort');
$r = [];
foreach($res as $__key => $__val) {
if(is_array($__val)) {
foreach($__val as $___val) {
$r[$___val] = $__key;
}
} else {
$r[$__val] = $__key;
}
}
return $r;
}
function bubbleSort(&$nums) {
for($i = 0;$i < count($nums);$i++) {
for($j = $i + 1;$j < count($nums);$j++) {
if($nums[$j] < $nums[$i]) {
list($nums[$j], $nums[$i]) = [$nums[$i], $nums[$j]];
}
}
}
}
function alphabetSort(&$alphabets) {
for($i = 0;$i < count($alphabets);$i++) {
for($j = $i + 1;$j < count($alphabets);$j++) {
if(ord($alphabets[$j]) < ord($alphabets[$i])) {
list($alphabets[$j], $alphabets[$i]) = [$alphabets[$i], $alphabets[$j]];
}
}
}
}
$a = arrSort($list);
var_dump($a);输出的结果:
array(4) {
["memcache"]=>
int(99)
["mongo"]=>
int(101)
["postgresql"]=>
int(101)
["redis"]=>
int(123)
}为了严格意义的排序,字符串排序使用了ord()这个函数。php本身俩个字符串也可以进行比较大小。。。暂时只有这个思路,这个函数优化的关键点也是这俩个排序函数,可以换成快排。

本文介绍了一个有趣的PHP数组排序问题及解决方案。通过对数组的键和值进行交换并自定义排序算法,实现了不使用系统函数对数组进行排序的目标。文章详细展示了排序函数的实现过程及其输出结果。
771

被折叠的 条评论
为什么被折叠?



