function mysort($arr)
{
for ($i = 0; $i < count($arr); $i++) {
$j = $i;
while ($j > 0 && $arr[$j] < $arr[$j-1]) {
$tmp = $arr[$j-1];
$arr[$j-1] = $arr[$j];
$arr[$j] = $tmp;
$j--;
}
}
return $arr;
}
$array = array(
'a' => '1',
'f' => '3',
'g' => '5',
's' => '2',
'r' => '8'
);
$values = array_values($array);
$sorted = array();
foreach (mysort($values) as $key=> $value) {
$sorted[$value] = $array[$value];
}
print_r($sorted);
我完全迷失在这里。我想做的是根据值对数组$ array进行排序,使输出为
a = 1
s = 2
f = 3
g = 5
r = 8
然而,我试图在不使用任何排序方法(如asort,usort或ksort)的情况下执行此操作。只是我自己的功能。
答案 0 :(得分:2)
这应该适合你:
在这里,我简单地循环遍历$array
的所有元素,并将它们保存在$sorted
中。在第一个if语句中,我检查$sorted
数组是否为空或者$array
的当前元素是否大于排序数组的最后一个元素。如果确实如此,我只需将元素末尾附加到$sorted
数组。
E.g。 (伪代码):
empty($sorted) || end($sorted) < current($array)
否则,我将进入我遍历$sorted
数组的else部分,以找到$sorted
的当前元素小于$array
的当前元素的位置并且$sorted
的下一个元素大于$array
的当前元素(所以要找到$array
的当前元素必须介于其中的点。)
E.g(伪代码):
current($sorted) < current($array) && next(current($sorted)) > current($array)
如果是这种情况,我首先从$sorted
数组的当前元素中删除该部分,并将其保存在tmp变量中。然后我追加$array
中的当前元素,然后在$sorted
数组的末尾追加我再次剪切的部分。
<?php
$array = [
'a' => '1',
'r' => '8',
'g' => '5',
'f' => '3',
's' => '2',
];
$sorted = [];
$keys = array_keys($array);
for($count = 0; $count < count($array); $count++) {
$tmpKeys = array_keys($sorted);
if(empty($sorted) || $sorted[$tmpKeys[count($sorted)-1]] < $array[$keys[$count]]) {
$sorted[$keys[$count]] = $array[$keys[$count]];
} else {
for($innerCount = 0; $innerCount < count($sorted)-1; $innerCount++) {
if($sorted[$tmpKeys[$innerCount]] < $array[$keys[$count]] && $array[$keys[$count]] < $sorted[$tmpKeys[$innerCount+1]]) {
$tmp = array_splice($sorted, $innerCount+1);
$sorted[$keys[$count]] = $array[$keys[$count]];
$sorted = array_merge($sorted, $tmp);
}
}
}
}
print_r($array);
print_r($sorted);
?>
输出:
Array ( [a] => 1 [r] => 8 [g] => 5 [f] => 3 [s] => 2 )
Array ( [a] => 1 [s] => 2 [f] => 3 [g] => 5 [r] => 8 )