Проблема с пользовательским скриптом для сортировки массивов в порядке возрастания и убывания

#php #arrays #sorting

#php #массивы #сортировка

Вопрос:

У меня есть проблема, с которой нужно разобраться здесь (логическая ошибка в моем коде 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);

?>
  

Комментарии:

1. Вы вообще читали мой пост? Повторный вопрос, поскольку я знаю, что вы этого не делали. Четко указано, что функций сортировки массивов нет

2. хорошо, извините, но вы можете сохранить сортировку по возрастанию и возвращать массив только от конца к первому элементу (используя count)

3. можете ли вы привести мне пример того, где мне нужно было бы это сделать? Или укажите мне на ту часть моего кода , в которой содержится логическая ошибка ?

4. я публикую ответ, надеюсь, вы поймете из него

Ответ №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;
    }
}
  

Комментарии:

1. Спасибо за это, поможет мне с режимом «по убыванию», но вы не совсем поняли мою проблему 🙂 Я бы знал, как это сделать в режиме убывания, дело в том, что код, который я сделал для режима возрастания, сортирует не ВСЕ переданные элементы массива. Попробуйте это в своем текстовом редакторе, и вы поймете, что я имею в виду

2. хорошо, я имею в виду, что вам нужно разработать его только один раз для desc или asc, а в другом варианте все, что вам нужно, это вернуть его в обратном порядке

3. Я понимаю это, но попробуйте запустить код для режима возрастания. У меня проблемы с корректной работой.