За последние 24 часа нас посетили 17860 программистов и 1719 роботов. Сейчас ищут 846 программистов ...

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

Тема в разделе "Прочие вопросы по PHP", создана пользователем Nick8, 10 ноя 2014.

  1. Nick8

    Nick8 Новичок

    С нами с:
    10 ноя 2014
    Сообщения:
    5
    Симпатии:
    0
    Многомерный массив выведен в таблицу. Таблица с 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>';
    }

    ?>
     
  2. goszowski

    goszowski Новичок

    С нами с:
    10 ноя 2014
    Сообщения:
    5
    Симпатии:
    0
    1) Там где <td>Surname</td> - сделать ссылку, на тот же документ, только с параметрами, например: ?sortby=name&order=asc (и, или desc). asc = по возрастанию, desc = по убиванию.
    Вместо asc и desc можно использовать свои слова.

    2) В коде где генерируется вывод нужно учитывать параметры $_GET;
    Есть у тебя функция compare1 а в ней Creditbook. Так вот этот элемент нужно подставлять из нашего $_GET, ну и в зависимости от значения $_GET['order'] вызывать compare1 или compare2. Все.
     
  3. Nick8

    Nick8 Новичок

    С нами с:
    10 ноя 2014
    Сообщения:
    5
    Симпатии:
    0
    Вот так?
    if ($_GET'mode']==1) {usort($Mass, "compare1");}
    else {usort($Mass, "compare2");}
     
  4. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Ага, только открывающую скобку после $_GET не забудьте
     
  5. Nick8

    Nick8 Новичок

    С нами с:
    10 ноя 2014
    Сообщения:
    5
    Симпатии:
    0
    А вот насчёт ссылки на документ...как я compare1 или compare2 для Creditbook там должен грамотно написать (вместо order=asc или order=desc)?

    <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>
     
  6. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    Так пробуй, ну или на листочки распиши как всё должно работать и потом в код переведи
     
  7. Nick8

    Nick8 Новичок

    С нами с:
    10 ноя 2014
    Сообщения:
    5
    Симпатии:
    0
    Сортировка по возрастанию для всех полей выполнена, как теперь реализовать по убыванию, подскажите... В итоге необходимо так, чтобы при первом клике по полю (к примеру 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">Creditb ook</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'] . "<br />". "</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;
    }
    /*
     
  8. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    ну вот я насчитал 3 варианта, которые ты хочешь реализовать:
    1. Первый раз, сортировки нет, параметра order нет, ссылку для сортировки делаем по возрастанию
    2. Если параметр order есть и он равен desc то ссылку для сортировки делаем order=asc
    3. Если параметр order есть и он равен asc то ссылку для сортировки делаем order=desc

    if ... else if .. else

     
  9. Nick8

    Nick8 Новичок

    С нами с:
    10 ноя 2014
    Сообщения:
    5
    Симпатии:
    0
    <td><a href="?sort=Surname&sort=ascsurname">Surname</a></td>

    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;
    }

    Так корявенько работает, как переделать?
     
  10. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    php.net/manual/ru/control-structures.elseif.php
     
  11. deblogger

    deblogger Новичок

    С нами с:
    11 июл 2013
    Сообщения:
    200
    Симпатии:
    0
    Сортировать можно по номерам полей. Демонстрировать вверх или вниз идет сортировка - подчеркиванием сверху или снизу, по какой колонке - жирным. Кусок из цикла (каменты добавил):

    Код (PHP):
    1.             if ($index+1 === (int) $get->field) { // номер активной колонки по которой сейчас сорт
    2.                 $order = ($get->order) ? null : 1;
    3.                 $style = 'text-decoration:' . ( ($order) ? 'overline;' : 'underline;');
    4.                 $style .= 'font-weight:bold;';
    5.             }
    6.             else {
    7.                 $style = 'text-decoration:none; font-weight:normal;';
    8.                 $order = 1; 
    9.             }
    10.             
    11.             $field->sortlink = '<a href="'
    12.                 .$page_url.$get->build_query(array('field'=>$index+1,'order'=>$order))
    13.                 .'" title="Сортировка" style="'.$style.'">'.$caption.'</a>';
    14.  
    Делал год назад, не доделал - mebmal.ru/tables?f=7&p=4 - и главное оказалось что по индексам сортировать вредно. Добавил поле в бд, убавил поле из бд - поиск немедленно сдох. Так что не делайте по индексам если хотите чтобы вас гугл индексировал, или не меняйте ничего никогда в бд, или делайте, ибо по индексам короче и проще.

    Да, затем когда из параметров построен запрос, он заканчивается например так ... order by 3 asc - после компиляции в смысле.
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    deblogger
    Код (Text):
    1.  
    2. <td colspan="2">
    3. <div class="divFooter borderRight"><span>И</span>нтернет-магазин .... </div>
    4. </td><td>
    5. <div class="divFooter"><span>Н</span>аш иллюстрированный каталог .... </div>
    6. </td>
    Код (Text):
    1.  
    2. .divFooter span {
    3. font-size: 400%;
    4. float: left;
    5. color: white;
    6. background-color: lightgrey;
    7. margin-right: 3px;
    8. line-height: .9em;
    9. }
    10.  
    11. .divFooter {
    12. padding: 1em;
    13. padding-bottom: 2em;
    14. display: inline-block;
    15. -moz-box-sizing: border-box;
    16. -webkit-box-sizing: border-box;
    17. box-sizing: border-box;
    18. }
    о боги... нтернет-магазин... аш иллюстрированный каталог...

    Код (Text):
    1. /* заменяем ".divFooter span" на: */
    2. .divFooter::first-letter {
    3. font-size: 400%;
    4. float: left;
    5. color: white;
    6. background-color: lightgrey;
    7. margin-right: 3px;
    8. line-height: .9em;
    9. }
    10.  
    11. .divFooter {
    12. /* оставляем как есть */
    13. }
    Код (Text):
    1.  
    2. <td colspan="2">
    3. <div class="divFooter borderRight">Интернет-магазин .... </div>
    4. </td><td>
    5. <div class="divFooter">Наш иллюстрированный каталог .... </div>
    6. </td>
    так же ж чище, не?

    Добавлено спустя 4 минуты 58 секунд:
    Авторизация
    ....
    Пароль от 3 до 64 символов
    ....

    какая разница какой длины у меня пароль? это мои личные данные. не ощущаю важность сайта - ткну "1" и отправлю. сайт обязан считать единицу моим паролем. свято верю что томик войны и мира меня спасет - копипаст и сайт обязан считать это моим паролем. то есть какая-то разумная размерность должна быть. килобайт например. но явно указывать что лишь 64 символа и что вообще есть какой-то лимит по длине пароля - не айс что-то...

    Добавлено спустя 4 минуты 28 секунд:
    "Пароль безразличен к регистру символов!" - чтоа? мой пАрОль равен Пароль и паРОЛЬ ??? то есть 32 комбинушки дают одинаковый результат? сильно.

    ладно, на этом закончу придираться))) мебель ничего так, красивая
     
  13. deblogger

    deblogger Новичок

    С нами с:
    11 июл 2013
    Сообщения:
    200
    Симпатии:
    0
    Выпейте галоперидолу для начала, чтобы не копаться в ящике с трусами находясь в гостях. Там было написано год назад или там не было написано год назад? Год назад с я трудом написал if(isset($_GET['submit']) echo 'работает'; а с этим неописуйемым текстовым конфигом под названием css до сих пор напряги. Гребись он конем. Теперь пейте циклодол.

    Добавлено спустя 16 минут 13 секунд:
    Точно, вспомнил, лет 15 назад правильный хтмл должен был быть из больших букв, а русский текст из коитуса. Только такие сайты признавались православными. <TABLE><TR><TD ALIGN="CENTER">бНОПНЯ</TD><TD><IMG BORDER="0" SRC="/images/logo.gif"></TD><TR></TABLE> Чувак под названием Артемий Лебедев там даже специально писал для любителей заглядывать под юбку, типа <!-- ну что, интересно да? --> Народ в юзенете жаловался на него сиськимасиськи. Так вот, я почему-то запомнил самый главный свой прикол. Вероятно это был самый первый раз когда я делал веб-страницу. Ну значит пишу я текст

    и делаю переносы там, где полагается

    а он сука в браузере, без переносов оказывается.

    В тексте переносы есть, в а браузере - пропадают начисто. Ну что за хрень, думаю, быть такого не может - оказывается может. Надо было ставить <br>.

    Так вот любитель галоперидола, по своей работе я столько навидался хтмлей, что мне за 100 жизней не написать, и там такое бывает, отчего вы скончались бы на месте. Делать отступы и промежутки с помощью br до сих по в тренде.
     
  14. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ок, я договорился с ближайшей аптекой о пожизненной поставке галоперИдола.
    не хочу скончаться, аптека ж тогда мало маржи получит. и как-то "ещё" не хочу смотреть. глянул конкретно ваш, поделился с санитарами своими переживаниями :D
     
  15. deblogger

    deblogger Новичок

    С нами с:
    11 июл 2013
    Сообщения:
    200
    Симпатии:
    0
    Ну хулеж с долбоящера возьмешь. Так и будет теперь корчится доказывая что имеет право. Имеете-имеете, только и другие имеют, понимаете? С такой например ботанской репой в калашный ряд не комильфо.

    Добавлено спустя 2 минуты 48 секунд:
    То есть вас долбоящера не приглашали оценить дизайн или там юзабилитю или что-то еще и тем более эффективность текстов и конфига. Даже не вам дали даже не ссылку, чисто убедиться что сортировка таблицы дело не сложное, особенно если не париться проблемой индексации поисковиками.

    Нет, вы ж доебались до какой-то хуеты, о которой я уже и забыл начисто. Почему? Потому что вы - мудак.
     
  16. rognorog

    rognorog Новичок

    С нами с:
    7 июл 2014
    Сообщения:
    330
    Симпатии:
    0
    Есть такой " &nbsp; ", хорошо справляется=)
    Остается только дунуть или обожраться колес, чтобы сделать таблицу.