【问题标题】:Issue with custom script to sort Arrays ascending and descending order使用自定义脚本对数组进行升序和降序排序的问题
【发布时间】:2014-08-12 14:05:35
【问题描述】:

我在这里有一个问题要处理(我的代码中有一个逻辑错误 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);

?>

【问题讨论】:

  • 你读过我的帖子吗?反问,因为我知道你没有。明确说明没有数组排序功能
  • 好的,抱歉,但您可以保持升序排序,只返回数组从末尾到第一个元素(使用计数)
  • 你能举个例子说明我需要在哪里做这个吗?或者指出我的代码中有逻辑错误的部分?
  • 我发表了一个答案,希望你能从中理解

标签: php arrays sorting


【解决方案1】:

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

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;
    }
}

【讨论】:

    【解决方案2】:
    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;
        }
    }
    

    【讨论】:

    • 谢谢你,将帮助我使用“降序”模式,但你不太明白我的问题 :) 我会知道如何在降序模式下进行操作,问题是我所做的代码ASCENDING 模式,不对所有传递的数组元素进行排序。在你的文本编辑器中尝试一下,你就会明白我的意思了
    • 好的,我的意思是你只需要为 desc 或 asc 开发一次,在另一个选项中你只需要反向返回它
    • 我明白这一点,但尝试运行升序模式的代码。我无法使其正常工作。
    猜你喜欢
    • 1970-01-01
    • 2015-08-30
    • 2013-08-16
    • 1970-01-01
    • 2020-06-06
    • 2012-04-18
    • 2016-11-05
    • 2017-05-16
    • 1970-01-01
    相关资源
    最近更新 更多