Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2014, 16:12   #1
Nick888
 
Регистрация: 10.11.2014
Сообщений: 9
По умолчанию Отсортировать кликом по заголовку столбца

Многомерный массив выведен в таблицу. Таблица с 4 полями: фамилия, имя, дата рождения, номер зачётной книжки. Сортировка сделана по номеру зачётной книжки (возрастание, убывание). Как теперь сделать, чтобы сортировка производилась кликом по заголовку столбца?

<?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 '<td>Surname</td>';
echo '<td>Name</td>';
echo '<td>Birthday</td>';
echo '<td>Creditbook</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
usort($Mass, "compare1"); # 'Номер зачётной книжки' по возрастанию
#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>';
}

?>
Nick888 вне форума Ответить с цитированием
Старый 10.11.2014, 17:03   #2
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,159
По умолчанию

тут два варианта:
1. Использовать JS (JQuery) морду с возможностью сортировки содержимого.. php тогда не при чем
2. Обрабатывать клик по заголовку столбца тем-же JS и перезагружать страницу с параметром столбца ... типа
Код:
...onClick("window.location=index.php?mode=1");
в php смотреть какой параметр передан
Код:
if ($_GET'mode']==1) {usort($Mass, "compare1");} else {usort($Mass, "compare2");}
ну и соответсвенно выводить при построении страницы mode=1 или mode=0 .. сто туда-сюда переключалось
....
еще в втором случае можно замутить AJax обновление контента.....
ADSoft вне форума Ответить с цитированием
Старый 11.11.2014, 22:12   #3
Nick888
 
Регистрация: 10.11.2014
Сообщений: 9
По умолчанию

Переделал немного... Сортировка производится кликом по заголовку столбца, но работает лишь для одного из 4 (только для поля creditbook). Как переделать, чтобы для каждого столбца работала, подскажите.

<?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&order1=ascsurna me">Surname</a></td>
<td><a href="?sort=Name&order2=ascname">Na me</a></td>
<td><a href="?sort=Birthday">Birthday</a></td>
<td><a href="?sort=Creditbook&order3=ascby cred">Creditbook</a></td>
</tr>
';


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");} #'Номер зачётной книжки' по убыванию



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

?>
Nick888 вне форума Ответить с цитированием
Старый 11.11.2014, 23:38   #4
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,159
По умолчанию

Ну а что хотели? У вас условаия else то отрабатываются всегда.... Конкретной режим конкретное сравнение.... Switch case лучше использоваать
ADSoft вне форума Ответить с цитированием
Старый 13.11.2014, 03:21   #5
Nick888
 
Регистрация: 10.11.2014
Сообщений: 9
По умолчанию

Использовал конструкцию switch-case, теперь сортируются по возрастанию все поля. При нажатии на заголовок sirname - сортируется sirname, при нажатии на name - сортируется name, и так далее. А как сделать так, чтобы при первом клике по полю (к примеру sirname) была сортировка по возрастанию, при втором по убыванию, при третьем снова по возрастанию, при четвёртом опять по убыванию... ?

<td><a href="?sort=Surname&order1=ascsurna me">Surname</a></td>
<td><a href="?sort=Name&order2=ascname">Na me</a></td>
<td><a href="?sort=Birthday&order4=ascbirt hday">Birthday</a></td>
<td><a href="?sort=Creditbook&order3=ascby cred">Creditbook</a></td>


switch ($_GET['order1']==ascsurname):
case "surname":
{usort($Mass, "compare1");};
break;
case "surname1":
{usort($Mass, "compare2");};
break;
endswitch;


switch ($_GET['order2']==ascname):
case "name":
{usort($Mass, "compare3");};
break;
case "name1":
{usort($Mass, "compare4");};
break;
endswitch;


switch ($_GET['order3']==ascbycred):
case "srav_surname":
{usort($Mass, "compare5");};
break;
case "srav_surname1":
{usort($Mass, "compare6");};
break;
endswitch;


switch ($_GET['order4']==ascbirthday):
case "birthday":
{usort($Mass, "compare7");};
break;
case "birthday1":
{usort($Mass, "compare8");};
break;
endswitch;
Nick888 вне форума Ответить с цитированием
Старый 13.11.2014, 08:08   #6
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,159
По умолчанию

1. Похоже вы не поняли прелесть switch ... он шире if и по сути у вас должен быть только 1 switch и куча case и все ... не нужно после каждого второго кейса закрывать
2. и не нужно дополнительных параметров order1
3. я вроде бы уже писал ранее.... нужно менять направление сортировки в ссылках
Код:
switch ($_GET['sort'])
{
 case "ascsurname":
   usort($Mass, "compare1");
  echo '<td><a href="?sort=descsurname">Surname</a></td>';
 break 1;
case "descsurname":
 usort($Mass, "compare2");
  echo '<td><a href="?sort=asccsurname">Surname</a></td>';
break 1;
....
итд для всех сортировок и направлений
}
ADSoft вне форума Ответить с цитированием
Старый 14.11.2014, 18:44   #7
Nick888
 
Регистрация: 10.11.2014
Сообщений: 9
По умолчанию

Немного не так. Появляется ещё одно поле и там свои проблемки, нажимаю на это "новое" поле, сортировка по убыванию производится, но сразу после этого поле "исчезает"...Нужно как-то изменить внутри case...

switch ($_GET['sort'])
{

case "ascsurname":
usort($Mass, "compare1");
echo '<td><a href="?sort=descsurname">Surname</a></td>';
break 1;
case "descsurname":
usort($Mass, "compare2");
echo '<td><a href="?sort=asccsurname">Surname</a></td>';
break 1;


case "ascname":
usort($Mass, "compare3");
echo '<td><a href="?sort=descname">Surname</a></td>';
break 1;
case "descname":
usort($Mass, "compare4");
echo '<td><a href="?sort=ascname">Surname</a></td>';
break 1;


case "asccreditbook":
{usort($Mass, "compare5");};
echo '<td><a href="?sort=desccreditbook">Surname </a></td>';
break;
case "desccreditbook":
{usort($Mass, "compare6");};
echo '<td><a href="?sort=asccreditbook">Surname</a></td>';
break;


case "ascbirthday":
{usort($Mass, "compare7");};
echo '<td><a href="?sort=descbirthday">Surname</a></td>';
break;
case "descbirthday1":
{usort($Mass, "compare8");};
echo '<td><a href="?sort=ascbirthday">Surname</a></td>';
break;

}
Nick888 вне форума Ответить с цитированием
Старый 15.11.2014, 13:52   #8
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,159
По умолчанию

Вам что все разжевывать? Бездумно чтоли делаете? У вас везде вывод _surname а ссылки разные я большеи не буду подсказывать, задействуйте серое вещество
ADSoft вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка матрицы. Первую и вторую строки отсортировать выбором по убыванию, пятый и шестой столбец отсортировать (С++) Sasha316 Помощь студентам 0 23.11.2012 00:48
двойной клик по заголовку окна andrew_jr20 C# (си шарп) 2 17.12.2011 20:03
Как найти программу по заголовку и закрыть ее? Catsys Общие вопросы Delphi 2 16.09.2011 23:26
Убить процесс по заголовку окна Nice42ru Помощь студентам 27 21.01.2010 11:55
Событие click по заголовку формы? Polotenchik Общие вопросы Delphi 3 24.06.2009 12:48