Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Отсортировать кликом по заголовку столбца


Автор: Nick888 11.11.2014, 18:39
Многомерный массив выведен в таблицу. Таблица с 4 полями: фамилия, имя, дата рождения, номер зачётной книжки. Сортировка сделана по номеру зачётной книжки (возрастание, убывание). Как теперь сделать, чтобы сортировка производилась кликом по заголовку столбца? И как насчёт ссылки на документ...как я compare1 или compare2 для Creditbook там должен грамотно написать (вместо order=asc или order=desc)?

Код

<?php

$Mass = array(

array('Surname' => 'Ив', 'Name' => 'Иван', 'Birthday' => '1966.01.01', 'Creditbook' => '111'),
array('Surname' => 'Хр', 'Name' => 'Денис', 'Birthday' => '1968.02.02', 'Creditbook' => '112'),
array('Surname' => 'Ша', 'Name' => 'Николай', 'Birthday' => '1975.03.03', 'Creditbook' => '1199'),
array('Surname' => 'Че', 'Name' => 'Егор', 'Birthday' => '1976.04.04', 'Creditbook' => '1144'),
array('Surname' => 'Пр', 'Name' => 'Евгений', 'Birthday' => '1962.05.05', 'Creditbook' => '110'),
array('Surname' => 'Ар', 'Name' => 'Илья', 'Birthday' => '1960.06.06', 'Creditbook' => '116'),
array('Surname' => 'Пу', 'Name' => 'Александр', 'Birthday' => '1999.07.07', 'Creditbook' => '117'),
array('Surname' => 'Ма', 'Name' => 'Антон', 'Birthday' => '1988.08.08', 'Creditbook' => '118'),
array('Surname' => 'Жд', 'Name' => 'Александр', 'Birthday' => '1980.09.09', 'Creditbook' => '119'),
array('Surname' => 'Ше', 'Name' => 'Виталий', 'Birthday' => '1990.10.10', 'Creditbook' => '120')

);

echo '<table border=1>';

# Шапка таблицы
<td><a href="?sort=Surname&order=asc">Surname</a></td>
<td><a href="?sort=Name&order=asc">Name</a></td>
<td><a href="?sort=Birthday&order=asc">Birthday</a></td>
<td><a href="?sort=Creditbook&order=asc ">Creditbook</a></td>

# Функции сортировки по возрастанию и убыванию

function compare1 ($v1, $v2) {
if ($v1["Creditbook"] == $v2["Creditbook"]) return 0;
return ($v1["Creditbook"] < $v2["Creditbook"])? -1: 1;
}

function compare2 ($v1, $v2) {
if ($v1["Creditbook"] == $v2["Creditbook"]) return 0;
return ($v1["Creditbook"] < $v2["Creditbook"])? 1: -1;
}


# СОРТИРОВКА по creditbook
if ($_GET['mode']==1) 
{usort($Mass, "compare1");} #'Номер зачётной книжки' по возрастанию
else 
{usort($Mass, "compare2");} #'Номер зачётной книжки' по убыванию

#Вывод списка группы в таблицу
for ($i=0; $i<count($Mass); $i++)
{
echo '<tr>';
echo "<td>". $Mass[$i]['Surname'] . "</td>";
echo "<td>". $Mass[$i]['Name'] . "</td>";
echo "<td>". $Mass[$i]['Birthday'] . "</td>";
echo "<td>". $Mass[$i]['Creditbook'] . "<br />". "</td>";
echo '</tr>';
}

?>

Автор: Aliance 12.11.2014, 13:24
1. Пользуйтесь подсветкой синтаксиса кода (кнопочка КОД)
2. Не советую использовать php-комментарии через #
3. Чтобы не делать две функции, можно использовать замыкания (ключевое слово use), передавая порядок сортировки

Не очень понял вопроса на самом деле. В PHP коде у вас используется $_GET['mode'], а в HTML верстке заданы sort=X&order=Y. В принципе, второй вариант предпочтительнее, если вы хотите сделать сортировку по всем столбцам во всех направлениях. Но в тексте вашей проблемы я вижу только потребность в сортировке только по одному столбцу. Вы определитесь smile

Пока что, исходя из ваших же пожеланий, я бы порекомендовал вам сделать следующие изменения в адресах строчек шапки таблицы:
Код

$defaultOrder = 'asc';
$sortOrder = isset($_GET['order']) ? $_GET['order'] : $defaultOrder;
$sortOrder = in_array($sortOrder, array('asc', 'desc')) ? $sortOrder : $defaultOrder;
<td><a href="?sort=Creditbook&order=<?=($sortOrder == 'asc' ? 'desc' : 'asc')?>">Creditbook</a></td>


Таким образом, если у вас будет в текущей сортировкой выбрана asc, то в ссылку подставится противоположная - desc (повторный клик по шапке меняет направление сортировки).

И далее, в коде, используете примерно так (с замыканием):
Код

usort($Mass, function ($v1, $v2) use ($sortOrder) {
    if ($v1["Creditbook"] == $v2["Creditbook"]) return 0;

    return $sortOrder == 'desc'
              ? ($v1["Creditbook"] > $v2["Creditbook"] ? 1 : -1)
              : ($v1["Creditbook"] < $v2["Creditbook"] ? 1 : -1);
});

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)