自定义脚本问题,以排序数组升序和降序

时间:2014-06-22 10:59:48

标签: php arrays sorting

我有一个问题要处理(我的代码中的逻辑错误99%)。我似乎无法找到解决问题的方法,但我打赌你们其中一人会立刻发现问题!

我必须创建一个函数来对以asc或desc顺序传递给它的数组进行排序,但是不能使用任何数组排序函数!

到目前为止,我一直在努力解决循环问题,最后我想向其他开发者(你)寻求帮助。

目前只有升序代码可以使用,降序将是没有问题我假设一旦我这样做。它有点将值排序到某个点,但随后停止(如果下一个最小值位于传递的数组的末尾则停止)。我该怎么做才能防止这种情况并使它对整个数组及其元素进行排序?

到目前为止,这是代码。

<?php

function order_array($array,$mode = 'ascending') {

    $length = count($array);

    if($mode == 'descending') {     
        return $array;
    } else {

        $sorted_array = array();
        $used_indexes = array();

        for($i = 0; $i < $length; $i++) {
            $smallest = true;

            echo $array[$i] . '<br/>';
            for($y = 0; $y < $length; $y++) {

                //echo $array[$i] . ' > ' . $array[$y] . '<br/>';
                // if at ANY time during checking element vs other ones in his array, he is BIGGER than that element
                // set smallest to false
                if(!in_array($y,$used_indexes)) {
                    if($array[$i] > $array[$y]) {
                        $smallest = false;
                        break;
                    }
                }
            }

            if($smallest) {
                $sorted_array[] = $array[$i];
                $used_indexes[] = $i;
            }

        }

        return $sorted_array;
    }
}

$array_to_sort = array(1, 3, 100, 99, 33, 20);
$sorted_array = order_array($array_to_sort);
print_r($sorted_array);

?>

2 个答案:

答案 0 :(得分:1)

我通过完全不同的方式解决了这个问题。现在它正确排序传入的数组的所有元素。我遇到的逻辑问题是使用for()循环。 for()循环只运行一个set(传递数组的长度)次数,而我们需要它循环更多,因为我们需要一直循环,直到我们有一个新的排序数组按升序排列。以下是可行的代码

function order_array($array,$mode = 'ascending') {

    if($mode == 'descending') {

        // for() wont work here, since it will only loop an array length of times, when we would need it
        // to loop more than that.
        while(count($array)){
            $value = MAX($array); 
            $key = array_search($value, $array); 

            if ($key !== false) {
                unset($array[$key]);
            }
            $sorted[] = $value;
        }

        return $sorted;

    } else {

        // for() wont work here, since it will only loop an array length of times, when we would need it
        // to loop more than that.
        while(count($array)){
            $value = MIN($array); 
            $key = array_search($value, $array); 

            if ($key !== false) {
                unset($array[$key]);
            }
            $sorted[] = $value;
        }


        return $sorted;
    }
}

答案 1 :(得分:0)

function order_array($array,$mode = 'ascending') {

    $length = count($array);



        $sorted_array = array();
        $used_indexes = array();

        for($i = 0; $i < $length; $i++) {
            $smallest = true;

            echo $array[$i] . '<br/>';
            for($y = 0; $y < $length; $y++) {

                //echo $array[$i] . ' > ' . $array[$y] . '<br/>';
                // if at ANY time during checking element vs other ones in his array, he is BIGGER than that element
                // set smallest to false
                if(!in_array($y,$used_indexes)) {
                    if($array[$i] > $array[$y]) {
                        $smallest = false;
                        break;
                    }
                }
            }


            if($smallest) {
                $sorted_array[] = $array[$i];
                $used_indexes[] = $i;
            }


         if($mode == 'descending') {

            return array_reverse($sorted_array);
        }

        return $sorted_array;
    }
}