Отсортировать кликом по заголовку столбца

Обсуждение серверного программирования.

Модераторы: Duncon, Yurich

Ответить
Nick888
Сообщения: 9
Зарегистрирован: 11 ноя 2014, 18:31

11 ноя 2014, 18:34

Многомерный массив выведен в таблицу. Таблица с 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'] . "
". "</td>";
echo '</tr>';
}

?>
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

11 ноя 2014, 19:20

Что угодно в ссылке пишешь order=ascbyname например в скрипте встречаешь if($_GET['order']=='ascbyname') отсортировать массив так-то..
[syntax=Delphi] [/syntax]
Nick888
Сообщения: 9
Зарегистрирован: 11 ноя 2014, 18:31

11 ноя 2014, 20:23

Изменил:

<td><a href="?sort=Surname&order1=ascsurname">Surname</a></td>
<td><a href="?sort=Name&order2=ascname">Name</a></td>
<td><a href="?sort=Birthday">Birthday</a></td>
<td><a href="?sort=Creditbook&order3=ascbycred">Creditbook</a></td>


и здесь для 3 функций:

function compare1 ($v1, $v2) {
if ($v1["Surname"] == $v2["Surname"]) return 0;
return ($v1["Surname"] < $v2["Surname"])? -1: 1;
}
function compare2 ($v1, $v2) {
if ($v1["Surname"] == $v2["Surname"]) return 0;
return ($v1["Surname"] < $v2["Surname"])? 1: -1;
}
# СОРТИРОВКА по surname
if ($_GET['order1']=='ascsurname')
{usort($Mass, "compare1");} #'Номер зачётной книжки' по возрастанию
else
{usort($Mass, "compare2");} #'Номер зачётной книжки' по убыванию



function compare3 ($v1, $v2) {
if ($v1["Name"] == $v2["Name"]) return 0;
return ($v1["Name"] < $v2["Name"])? -1: 1;
}
function compare4 ($v1, $v2) {
if ($v1["Name"] == $v2["Name"]) return 0;
return ($v1["Name"] < $v2["Name"])? 1: -1;
}
# СОРТИРОВКА по name
if ($_GET['order2']=='ascname')
{usort($Mass, "compare3");} #'Номер зачётной книжки' по возрастанию
else
{usort($Mass, "compare4");} #'Номер зачётной книжки' по убыванию



function compare5 ($v1, $v2) {
if ($v1["Creditbook"] == $v2["Creditbook"]) return 0;
return ($v1["Creditbook"] < $v2["Creditbook"])? -1: 1;
}
function compare6 ($v1, $v2) {
if ($v1["Creditbook"] == $v2["Creditbook"]) return 0;
return ($v1["Creditbook"] < $v2["Creditbook"])? 1: -1;
}
# СОРТИРОВКА по creditbook
if ($_GET['order3']=='ascbycred')
{usort($Mass, "compare5");} #'Номер зачётной книжки' по возрастанию
else
{usort($Mass, "compare6");} #'Номер зачётной книжки' по убыванию


По одиночке (если только одну любую функцию из этих использовать, другие закомментить) всё работает нормально, а если все 3 одновременно в скрипте, то только срабатывает сортировка по 1 полю (в данном случае creditbook). Как переделать, подскажите.
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

11 ноя 2014, 20:48

if ($_GET['order1']=='ascsurname') так писать не обязательно, я ставлю order1=1 и проверяю в этом случае if(isset($_GET['order1'])).. смысл в том что если ты используешь как ключ значение или не используешь значение..
У тебя в конце else срабатывает постоянно, возможно в этом косяк? Зачем вообще else прописывать?
[syntax=Delphi] [/syntax]
Nick888
Сообщения: 9
Зарегистрирован: 11 ноя 2014, 18:31

14 ноя 2014, 05:15

Сортировка по возрастанию для всех полей выполнена, как теперь реализовать по убыванию, подскажите. Необходимо так, чтобы при первом клике по полю (к примеру sirname) была сортировка по возрастанию, при втором по убыванию, при третьем снова по возрастанию, при четвёртом опять по убыванию... ?

<?php

include ("sortirovka.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>';

# Шапка таблицы
echo '
<table border=1>
<tr>
<td><a href="?sort=Surname&sort=ascsurname">Surname</a></td>
<td><a href="?sort=Name&sort=ascname">Name</a></td>
<td><a href="?sort=Birthday&sort=ascbirthday">Birthday</a></td>
<td><a href="?sort=Creditbook&sort=asccreditbook">Creditbook</a></td>
</tr>
';


switch ($_GET['sort'])
{

case "ascsurname":
usort($Mass, "compare1");
break 1;
case "descsurname":
usort($Mass, "compare2");
break 1;


case "ascname":
usort($Mass, "compare3");
break 1;
case "descname":
usort($Mass, "compare4");
break 1;


case "asccreditbook":
{usort($Mass, "compare5");};
break;
case "desccreditbook":
{usort($Mass, "compare6");};
break;


case "ascbirthday":
{usort($Mass, "compare7");};
break;
case "descbirthday1":
{usort($Mass, "compare8");};
break;

}


#Вывод списка группы в таблицу
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'] . "
". "</td>";
echo '</tr>';
}

echo '</table>';

?>

/*
В файле sortitovka.php, функции выглядят следующим образом:
function compare1 ($v1, $v2) { #asc
if ($v1["Surname"] == $v2["Surname"]) return 0;
return ($v1["Surname"] < $v2["Surname"])? -1: 1;
}

function compare2 ($v1, $v2) { #desc
if ($v1["Surname"] == $v2["Surname"]) return 0;
return ($v1["Surname"] < $v2["Surname"])? 1: -1;
}
/*
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

14 ноя 2014, 11:39

Нерешаемо
return ($v1["Surname"] > $v2["Surname"])? 1: -1;
[syntax=Delphi] [/syntax]
Nick888
Сообщения: 9
Зарегистрирован: 11 ноя 2014, 18:31

14 ноя 2014, 12:16

??????????
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

14 ноя 2014, 12:21

Знак в сортировке поменяй, неужели это не очевидно.
[syntax=Delphi] [/syntax]
Nick888
Сообщения: 9
Зарегистрирован: 11 ноя 2014, 18:31

14 ноя 2014, 12:47

Эффекта нуль
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

14 ноя 2014, 16:27

Телепатически - эффект рук. Не получается - нагугли этих задачек по сортировке десятки.
[syntax=Delphi] [/syntax]
Ответить