Страницы

Поиск по вопросам

пятница, 28 февраля 2020 г.

функция для сортировка многомерного массива

#php #массивы #функции #сортировка


есть массив

$menu = [
     'tasks' => [
         'title' => 'Задачи',
         'path' => '/route/tasks/',
         'sort' => 3
     ],
     'obj' => [
         'title' => 'Цели',
         'path' => '/route/obj/',
         'sort' => 2
     ],
     'index' => [
         'title' => 'Главная',
         'path' => '/route/index/',
         'sort' => 1
     ],
     'message' => [
         'title' => 'Сообщения и предложения',
         'path' => '/route/message/',
         'sort' => 5
     ],
     'friends' => [
         'title' => 'Друзья',
         'path' => '/route/friends/',
         'sort' => 4
         ]
];


нужно отсортировать его по ключу 'sort'.
через функцию usort сортируется как надо:

$key = 'sort';
$sort = 'desc';

usort($menu, function ($a, $b) use ($key, $sort) {
    if ($sort == 'asc') {
        if ($a[$key] == $b[$key]) {
          return 0;
        }
        return ($a[$key] > $b[$key]) ? 1 : -1;
    }
    if ($sort == 'desc') {
        if ($a[$key] == $b[$key]) {
          return 0;
        }
        return ($a[$key] > $b[$key]) ? -1 : 1;
    }
});

echo '
';
var_dump($menu);


вывод: 

array(5) {
  [0]=>
  array(3) {
    ["title"]=>
    string(44) "Сообщения и предложения"
    ["path"]=>
    string(15) "/route/message/"
    ["sort"]=>
    int(5)
  }
  [1]=>
  array(3) {
    ["title"]=>
    string(12) "Друзья"
    ["path"]=>
    string(15) "/route/friends/"
    ["sort"]=>
    int(4)
  }
  [2]=>
  array(3) {
    ["title"]=>
    string(12) "Задачи"
    ["path"]=>
    string(13) "/route/tasks/"
    ["sort"]=>
    int(3)
  }
  [3]=>
  array(3) {
    ["title"]=>
    string(8) "Цели"
    ["path"]=>
    string(11) "/route/obj/"
    ["sort"]=>
    int(2)
  }
  [4]=>
  array(3) {
    ["title"]=>
    string(14) "Главная"
    ["path"]=>
    string(13) "/route/index/"
    ["sort"]=>
    int(1)
  }
}


делаю функцию, чтобы принимать значение $array, $key, $sort:

function array_sort($array, $key, $sort) {
   return usort($array, function($a, $b) use ($key, $sort) {
        if ($sort == 'asc') {
            if ($a[$key] == $b[$key]) {
                return 0;
            }
            return ($a[$key] > $b[$key]) ? 1 : -1;
        }
        if ($sort == "desc") {
            if ($a[$key] == $b[$key]) {
            return 0;
        }
        return ($a[$key] > $b[$key]) ? -1 : 1;
        }
    });
}
array_sort($menu, $key = 'sort', $sort = 'asc');
echo '
';
var_dump($menu);


вывод:

array(5) {
  ["tasks"]=>
  array(3) {
    ["title"]=>
    string(12) "Задачи"
    ["path"]=>
    string(13) "/route/tasks/"
    ["sort"]=>
    int(3)
  }
  ["obj"]=>
  array(3) {
    ["title"]=>
    string(8) "Цели"
    ["path"]=>
    string(11) "/route/obj/"
    ["sort"]=>
    int(2)
  }
  ["index"]=>
  array(3) {
    ["title"]=>
    string(14) "Главная"
    ["path"]=>
    string(13) "/route/index/"
    ["sort"]=>
    int(1)
  }
  ["message"]=>
  array(3) {
    ["title"]=>
    string(44) "Сообщения и предложения"
    ["path"]=>
    string(15) "/route/message/"
    ["sort"]=>
    int(5)
  }
  ["friends"]=>
  array(3) {
    ["title"]=>
    string(12) "Друзья"
    ["path"]=>
    string(15) "/route/friends/"
    ["sort"]=>
    int(4)
  }
}


подскажите пожалуйста, почему не работает функция, в чем я допустил ошибку? 
    


Ответы

Ответ 1



Вы передаете в свою функцию массив по значению, а не по ссылке. В итоге функция array_sort принимает копию исходного массива и сортирует ее не трогая оригинальный массив. Измените объявление функции на function array_sort(&$array, $key, $sort) { ^^^ и все будет работать

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

Отправить комментарий