Страница 1 из 1

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

Добавлено: 11 ноя 2014, 18:34
Nick888
Многомерный массив выведен в таблицу. Таблица с 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>';
}

?>

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

Добавлено: 11 ноя 2014, 19:20
Duncon
Что угодно в ссылке пишешь order=ascbyname например в скрипте встречаешь if($_GET['order']=='ascbyname') отсортировать массив так-то..

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

Добавлено: 11 ноя 2014, 20:23
Nick888
Изменил:

<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). Как переделать, подскажите.

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

Добавлено: 11 ноя 2014, 20:48
Duncon
if ($_GET['order1']=='ascsurname') так писать не обязательно, я ставлю order1=1 и проверяю в этом случае if(isset($_GET['order1'])).. смысл в том что если ты используешь как ключ значение или не используешь значение..
У тебя в конце else срабатывает постоянно, возможно в этом косяк? Зачем вообще else прописывать?

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

Добавлено: 14 ноя 2014, 05:15
Nick888
Сортировка по возрастанию для всех полей выполнена, как теперь реализовать по убыванию, подскажите. Необходимо так, чтобы при первом клике по полю (к примеру 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;
}
/*

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

Добавлено: 14 ноя 2014, 11:39
Duncon
Нерешаемо
return ($v1["Surname"] > $v2["Surname"])? 1: -1;

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

Добавлено: 14 ноя 2014, 12:16
Nick888
??????????

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

Добавлено: 14 ноя 2014, 12:21
Duncon
Знак в сортировке поменяй, неужели это не очевидно.

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

Добавлено: 14 ноя 2014, 12:47
Nick888
Эффекта нуль

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

Добавлено: 14 ноя 2014, 16:27
Duncon
Телепатически - эффект рук. Не получается - нагугли этих задачек по сортировке десятки.