@SerjNoob

Не могли бы вы ,уважаемые пользователи, помочь с заданием по php?

сортировка массивов любой вложенности по возрастанию , без использования готовых методом ( написать свой метод, который будет сортировать массив и все подмассивы )
используя алгоритмы сортировки вроде quicksort получается только отсортировать основной массив

function quicksort($arr){
    $lte = $gt = array();
    if(count($arr) < 2){
        return $arr;
    }
    $pivot_key = key($arr);
    $pivot = array_shift($arr);
    foreach($arr as $val){
        if($val <= $pivot){
            $lte[] = $val;
        } else {
            $gt[] = $val;
        }


    }
    return array_merge(quicksort($lte),array($pivot_key=>$pivot),quicksort($gt));
}
 

$arr = quicksort($arr);
var_dump($arr);


Ну и с ассоциативным массивом тоже проблемы ,третий уровень вложенности не сортирует по ключу
if (count($array))
        $temp_array[key($array)] = array_shift($array); // присваиваем первый эл массива ключу

    foreach($array as $key => $val){
        $offset = 0;
        $found = false;
        foreach($temp_array as $tmp_key => $tmp_val)
        {
            if(!$found and strtolower($val[$subkey]) > strtolower($tmp_val[$subkey]))
            {
                $temp_array = array_merge(    (array)array_slice($temp_array,0,$offset),//сливаем кол-во массивов
                                            array($key => $val),
                                            array_slice($temp_array,$offset) //выбираем срез массива
                                          );
                $found = true;
            }
            $offset++;
        }
        if(!$found) $temp_array = array_merge($temp_array, array($key => $val));
    }

    if ($sort_ascending) $array = array_reverse($temp_array); //возвращает массив с эл в обратном порядке

    else $array = $temp_array;
}

mySort($data , 'id'  );

var_dump($data);
  • Вопрос задан
  • 1372 просмотра
Решения вопроса 1
@dtBlack
Я как понимаю отсортировать одноуровневый массив у вас не вызывает трудностей?
Так почему тогда не использовать рекурсивный вызов такой функции? Тем более в первом примере рекурсия используется.

Простой пример с методом пузырька будет выглядеть так:
function mySort($array){
    // перебираем массив
    for ($j = 0; $j < count($array) - 1; $j++){
        for ($i = 0; $i < count($array) - $j - 1; $i++){
            // если текущий элемент больше следующего
            if ($array[$i] > $array[$i + 1]){
                // меняем местами элементы
                $tmp_var = $array[$i + 1];
                $array[$i + 1] = $array[$i];
                $array[$i] = $tmp_var;
            }
        }
    }
    //Производим сортировку во вложенных массивах, по необходимости можно выполнить перед основной сортировкой
    foreach ($array as $key => &$item){
        if (is_array($item)){
            $item = mySort($item);
        }
    }
    return $array;
}
$arr = array(7,9,8,array(3,2,1),1,2,3,4,5,6);
print_r(mySort($arr));


Все кроме строк:
foreach ($array as $key => &$item){
        if (is_array($item)){
            $item = mySort($item);
        }
    }

является реализацией метода пузырька.

PS: для реализации сортировки вложенных уровней достаточно слегка изменить пример с quicksort, но я думаю автор это сделает самостоятельно...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽