За последние 24 часа нас посетили 50899 программистов и 1761 робот. Сейчас ищут 947 программистов ...

Алфавитный каталог

Тема в разделе "PHP для новичков", создана пользователем Axios, 3 фев 2017.

  1. Axios

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

    С нами с:
    13 янв 2013
    Сообщения:
    52
    Симпатии:
    1
    Как сделать вот такой алфавитный каталог?

    Знаю как отсортировать, но как разбить на группы?
     

    Вложения:

  2. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Циклом пройтись, через preg_match () проверить первую букву, в каждой итерации проверять, не поменялась ли буква. Цикл добавляет в двухмерный массив переменную.
     
  3. Axios

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

    С нами с:
    13 янв 2013
    Сообщения:
    52
    Симпатии:
    1
    а можно пример, пожалуйста
     
  4. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Щас попробую что-то наваять)
     
  5. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    PHP:
    1. $array = ["Абсент", "Водка", "Ликёр", "Пиво", "Саке"];
    2. $letter = 1;
    3. $sorted = [][];
    4. foreach ($array as $item) {
    5.   $first = $item[0];
    6.   //Заменяем первую букву на заглавную на всякий случай.
    7.   $last = mb_substr($item,1);
    8.   $first = mb_strtoupper($first, 'UTF-8');
    9.   $item = $first.$last;
    10.   array_push ($sorted[$first], $item);
    11. }
    По логике должно работать, но я не тестировал.
     
  6. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    Интересная конструкция
     
  7. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    https://secure.php.net/manual/ru/language.types.array.php
     
  8. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    denis01 нравится это.
  9. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Короче, хватит выделоваться) Нашёл по первому запрос в гугле:
    PHP:
    1. function sorting( & $array ) {
    2.         $memory = NULL;      
    3.         $sorting = array();
    4.         foreach( $array as $item ) {
    5.             $letter = mb_substr( $item, 0, 1, 'utf-8' );
    6.             if( $letter != $memory )
    7.             {
    8.                 $memory = $letter;
    9.                 $sorting[$memory] = array();
    10.             }
    11.             $sorting[$memory][] = $item;
    12.         }
    13.         $array = $sorting;
    14.         return ($array);
    15.     }
    16. $array = [ "Вино", "Абсент", "Водка", "Ликёр", "Сидр", "Пиво", "Саке"];
    17. asort($array);
    18. $array = sorting ($array);
    19. print_r ($array);
     
  10. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Можно и так:
    PHP:
    1. $array = [[]];
    Но я предпочитаю вариант который привел ты.
     
  11. Singh

    Singh Новичок

    С нами с:
    3 фев 2017
    Сообщения:
    6
    Симпатии:
    1
    PHP:
    1. $arr = array("Aaaa", "Abbbbb", "acCccc", "Baaaaa", "bbbbbb", "Fcdsccc", "Zfdflfd", "Zzzzzzz");
    2.  
    3. for ($i = 0; $i <= count($arr)-1; $i++) {
    4.     if (mb_strtolower($arr[$i][0]) != mb_strtolower($arr[$i-1][0])) {
    5.         echo "<b>",$arr[$i][0],"</b><br>",$arr[$i],"<br>";
    6.     } else echo $arr[$i],"<br>";
    7. }
    A
    Aaaa
    Abbbbb
    acCccc
    B
    Baaaaa
    bbbbbb
    F
    Fcdsccc
    Z
    Zfdflfd
    Zzzzzzz
     
  12. Poznakomlus

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

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    PHP:
    1. $arr = array( 'Zfdflfd', 'Aaaa', 'Abbbbb', 'acCccc', 'Baaaaa', 'bbbbbb', 'Fcdsccc', 'Zzzzzzz');
    2. $catalog = array_reduce($arr, function ($carry, $item) {
    3.         $carry[strtoupper($item{0})][] = $item;
    4.         return $carry;
    5. }, array());
    6. ksort($catalog);
    7. var_dump($catalog);
    Не стоит каждую итерацию вычислять count массива
    Для юникода соответсвенно функции с приставкой mb_
     
    Singh нравится это.
  13. Singh

    Singh Новичок

    С нами с:
    3 фев 2017
    Сообщения:
    6
    Симпатии:
    1
    +1 Спасибо!
     
  14. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Ты же наверное из бд циклом выводишь всё это дело. Можно в тот же цикл всё это дело запихать и сделать за один прогон, чтобы циклы не плодить и время обработки не увеличивать.
     
  15. Axios

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

    С нами с:
    13 янв 2013
    Сообщения:
    52
    Симпатии:
    1
    Спасибо. Много новых названий, буду изучать)))
     
  16. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    "Если рядом воробей, мы готовим пушку"(с). Регулярки ради первой буквы - это что-то новое. В php хренова туча функций для работы со строками, которые позволяют в 95% случаев обходиться вовсе без регулярок. Которые работают в разы быстрее регулярок. Их юзать надо.

    И да, использование вот такого доступа к первой букве:
    Код (Text):
    1. $arr[$i][0]
    2. $item{0}
    Не фонтан. @Poznakomlus не забыл упомянуть про mb_ для мультибайтовых кодировок, а вот про то, что обращение по индексу символа для мультибайта не работает, забыл. Суть в том, что $string[$index] это не обращение к символу. Это обращение к байту. Вбейте в обрабатываемый массив кириллицу, и все сломается, потому что $string[0] возьмет не первую букву, а "половинку" первой буквы, и интерпретирует этот байт как самостоятельный символ. Для вытаскивания символов из строк, где может быть кириллица, используйте mb_substr.

    А еще, можно кроме функций для обходов массива неявным циклом, использовать такую конструкцию:
    PHP:
    1. for($i=0, $limit = count($arr); $i < $limit; $i++){}
    И да, автор если не брать в расчет избыточность самой конструкции, дергающей пересчет длины массива, зачем делать $i<=count($arr)-1, если можно просто $i<count($arr) ?:)

    Сравни
    PHP:
    1. for($i=0, $limit = count($arr); $i < $limit; $i++){}
    и
    PHP:
    1. for($i=0, $limit = count($arr); $i <= $limit-1; $i++){}
    Второй вариант, сдается мне, выглядит страннее.
     
  17. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Согласен, погорячился я с регуляркой, просто как раз изучал регулярки недавно, и вспомнил что там есть такая возможность, определить первую букву, но когда начал делать - осознал:)
     
  18. Singh

    Singh Новичок

    С нами с:
    3 фев 2017
    Сообщения:
    6
    Симпатии:
    1
    ))) Да! Это я стормозил! :D