Отсортировать кликом по заголовку столбца
Многомерный массив выведен в таблицу. Таблица с 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>';
}
?>
<?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>';
}
?>
Что угодно в ссылке пишешь order=ascbyname например в скрипте встречаешь if($_GET['order']=='ascbyname') отсортировать массив так-то..
[syntax=Delphi] [/syntax]
Изменил:
<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). Как переделать, подскажите.
<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). Как переделать, подскажите.
if ($_GET['order1']=='ascsurname') так писать не обязательно, я ставлю order1=1 и проверяю в этом случае if(isset($_GET['order1'])).. смысл в том что если ты используешь как ключ значение или не используешь значение..
У тебя в конце else срабатывает постоянно, возможно в этом косяк? Зачем вообще else прописывать?
У тебя в конце else срабатывает постоянно, возможно в этом косяк? Зачем вообще else прописывать?
[syntax=Delphi] [/syntax]
Сортировка по возрастанию для всех полей выполнена, как теперь реализовать по убыванию, подскажите. Необходимо так, чтобы при первом клике по полю (к примеру 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;
}
/*
<?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;
}
/*
Нерешаемо
return ($v1["Surname"] > $v2["Surname"])? 1: -1;
return ($v1["Surname"] > $v2["Surname"])? 1: -1;
[syntax=Delphi] [/syntax]
Знак в сортировке поменяй, неужели это не очевидно.
[syntax=Delphi] [/syntax]
Телепатически - эффект рук. Не получается - нагугли этих задачек по сортировке десятки.
[syntax=Delphi] [/syntax]