@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, но я думаю автор это сделает самостоятельно...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы