如何在不使用任何php内置函数的情况下根据键对关联数组进行排序

时间:2014-07-18 04:32:05

标签: php arrays associative

     $array = array(
        '2' => 'a',
        '5' => 'b',
        '1' => 'c',
        '5' => 'd',
        '3' => 'e'
    )

foreach($array as $key => $value){

        $array1 = $array;
        foreach($array1 as $key1 => $value1){
            if($key > $key1){
                $result[$key1] = $value1;
            }
        }
}

    print_r($result);

这是我的输出:

Array
(
    [1] => c
    [2] => a
    [3] => e
)

我通过将此数组存储在另一个数组中来对密钥进行比较, 如果是num>在这种情况下,num是最大数字5(5> 5),这个条件失败,因此5不在新数组中。所以,任何人都可以告诉我这将是如何排序或有更好的方法。 提前谢谢。

1 个答案:

答案 0 :(得分:2)

您的算法不起作用,因为外部循环遍历每个键,内部循环将尝试将少于当前键的任何键插入到数组中。虽然这些键小于当前键,但它不保证它们按升序排列。例如,以下数组将不起作用:

array(
  3 => 'a',
  2 => 'b',
  1 => 'c'
);

当然,它有一个问题,就是你可能已经注意到了原始数组中遗漏了一些元素。

相反,您可以使用任何排序算法(如mergesort,quicksort等)首先对键进行排序,然后构建新的关联数组。下面实现了insertion_sort(因为它很容易)。

function insertion_sort($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(
    '2' => 'a',
    '5' => 'b',
    '1' => 'c',
    '5' => 'd',
    '3' => 'e'
);
$keys = array_keys($array);

$sorted = array();
foreach (insertion_sort($keys) as $key) {
    $sorted[$key] = $array[$key];
}

print_r($sorted);

打印

Array
(
    [1] => c
    [2] => a
    [3] => e
    [5] => d
)