#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. Я понимаю это, но попробуйте запустить код для режима возрастания. У меня проблемы с корректной работой.