За последние 24 часа нас посетили 22497 программистов и 1276 роботов. Сейчас ищут 740 программистов ...

сортировка записей из базы данных (MySQL)

Тема в разделе "PHP для профи", создана пользователем Ruslanpro, 5 дек 2018.

Метки:
  1. MRSgiba

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

    С нами с:
    22 дек 2017
    Сообщения:
    200
    Симпатии:
    32
    @Ruslanpro Что-то типа такого:
    PHP:
    1. <?php
    2. $result = ['алмазная резка','автоматика','архитектура','барельеф','бетонные работы','бурение скважин','вентиляция','витражи','водопровод','гиодезия'];
    3.  
    4. $letter_result = [["А"],["Б"],["В"],["Г"],["Д"],["Е"],["Ё"],["Ж"],["З"],["И"],["Й"],["К"],["Л"],["М"],["Н"],["О"],["П"],["Р"],["С"],["Т"],["У"],["Ф"],["Х"],["Ц"],["Ч"],["Ш"],["Щ"],["Ъ"],["Ы"],["Ь"],["Э"],["Ю"],["Я"]];
    5. $count=0;
    6.  
    7. while ($count<count($letter_result)) {
    8.     foreach ($result as $r) {
    9.         if (mb_stripos($r,$letter_result[$count][0])===0) {$letter_result[$count][]=$r;}
    10.         else $count++;
    11.     }
    12. }
    13.  
    14. echo '<pre>';
    15. print_r($letter_result);
    16. echo '</pre>';
    17.  
    18. ?>
    А дальше на печать $letter_result, где каждый 0 - это буква, каждый не 0 - категория, и если длина массива 1, то категорий на эту букву нет.
    П.С. Массив из базы должен быть отсортирован
     
    #26 MRSgiba, 6 дек 2018
    Последнее редактирование: 6 дек 2018
  2. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    PHP:
    1. <?php
    2.  
    3.  
    4. $result = [
    5.     'алмазная резка',
    6.     'автоматика',
    7.     'архитектура',
    8.     'барельеф',
    9.     'бетонные работы',
    10.     'бурение скважин',
    11.     'вентиляция',
    12.     'витражи',
    13.     'водопровод',
    14.     'гиодезия'
    15.     ];
    16. $letter_result = [
    17.                 ["А"],["Б"],["В"],["Г"],["Д"],["Е"],
    18.                 ["Ё"],["Ж"],["З"],["И"],["Й"],["К"],
    19.                 ["Л"],["М"],["Н"],["О"],["П"],["Р"],
    20.                 ["С"],["Т"],["У"],["Ф"],["Х"],["Ц"],
    21.                 ["Ч"],["Ш"],["Щ"],["Ъ"],["Ы"],["Ь"],
    22.                 ["Э"],["Ю"],["Я"]];
    23.                
    24. foreach($letter_result as $letter) {
    25.     echo mb_strtolower($letter[0]) . '<br>';
    26.    
    27.     foreach($result as $title) {
    28.    
    29.         if(mb_substr($title, 0, 1) == mb_strtolower($letter[0])) {
    30.             echo $title . '<br>';
    31.        
    32.             $key = array_search($title, $result);
    33.             unset($result[$key]);
    34.         }
    35.     }
    36.     echo '<br>';
    37.    
    38. }
    39.  
    40. echo '<pre>';
    41.     print_r($result);
    42. echo '</pre>';
     
    #27 Dimon2x, 6 дек 2018
    Последнее редактирование: 6 дек 2018
  3. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
  4. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Dimon2x, почему я должен это удалять?
     
  5. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    @Valick потому что обращаешься к базе циклом, да ещё с помощью mysql
     
  6. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Dimon2x
    1) ты год поста посмотри
    2) это не боевой запрос, а всего лишь подсказка, что MySQL умеет работать со строками ( функция LEFT() ) не хуже, а иногда и лучше РНР.
    а это даже желания нет комментировать...
     
  7. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    @Valick ну немного не внимательно посмотрел
     
  8. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    PHP:
    1. SELECT UPPER(SUBSTRING(name, 1, 1)) AS `fl` FROM `table`
    Запрос который вернёт первую букву поля name и сделает её заглавной.
    А теперь вопрос на засыпку: "Зачем в MySQL есть UPPER(SUBSTRING(name, 1, 1)), когда то же самое можно сделать средствами РНР?"
     
  9. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    @Valick потому что MySQL никакого отношения к php не имеет и его используют отдельно.
     
  10. Ruslanpro

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

    С нами с:
    17 мар 2017
    Сообщения:
    151
    Симпатии:
    6
    @MRSgiba
    так
    Image 11.png

    0 над названием категории это количество мастеров в данной категории
     
  11. MRSgiba

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

    С нами с:
    22 дек 2017
    Сообщения:
    200
    Симпатии:
    32
    @Dimon2x А чем if(mb_substr($title,0,1)==mb_strtolower($letter[0])) лучше if(mb_stripos($r,$letter_result[$count][0])===0) ???
    Я думаю что названия категорий могут вбить и с большой буквы.
    Уж как сделать чтоб геодезия не потерялась он может сам сделать, тем более он ПРО.
     
  12. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
  13. Ruslanpro

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

    С нами с:
    17 мар 2017
    Сообщения:
    151
    Симпатии:
    6
    @MRSgiba ПРО потому что у меня проект называется Прораб Сервис
     
  14. Ruslanpro

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

    С нами с:
    17 мар 2017
    Сообщения:
    151
    Симпатии:
    6
    Warning: mb_stripos(): Empty delimiter in D:\OSPanel\domains\localhost\menu_general\gallery_menu.php on line 65
    Не могу понять в чем ошибка
    PHP:
    1. while ($count<count($letter_result)) {
    2.                     foreach ($result as $r) {
    3.                         if (mb_stripos($r,$letter_result[$count][0])===0){
    4.                
    5.                             $letter_result[$count][]=$r;
    6.                         }
    7.                         else $count++;
    8.                     }
    9.                 }
     
  15. MRSgiba

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

    С нами с:
    22 дек 2017
    Сообщения:
    200
    Симпатии:
    32
    @Ruslanpro ошибка в том что в $letter_result[$count][0] приходит пустая строка, откуда она приходит я не знаю. Смотри через var_dump или print_r, и выясняй
     
  16. Ruslanpro

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

    С нами с:
    17 мар 2017
    Сообщения:
    151
    Симпатии:
    6
    Этот код на планшете
    --- Добавлено ---
    Когда добавил еще одну категорию «гипсокартон» в массив $result вышла ошибка
    --- Добавлено ---
    Почему первое название категории не выводит начиная с буквы Б В Г
     

    Вложения:

  17. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Уважаемый Про, если я вам, как Про, задам вопросы, которые вызывают затыки у меня, вы, уважаемый Про, кодящий наугад, путающий сортировку, апперкейс, не умеющий внятно излагать мысли, и пищущий "bukva" и "yakor", ПРОсто охуeете.

    По этому, нехер огрызаться.
     
  18. Ruslanpro

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

    С нами с:
    17 мар 2017
    Сообщения:
    151
    Симпатии:
    6
    @Fell-x27 «умник» во впервых я не программист код пишу так как мне понятно. Во вторых твое какое дело что у меня там Pro или Profi. Я тебя не спрашивал про твое фото на аватар которое смахивает на твой характер. Спустись по ниже я не люблю высокомерных людей.
    --- Добавлено ---
    @Fell-x27 Посмотри как наш диалог начинался и кто там начал на личность переходить
    --- Добавлено ---
    Давайте каждую подпись через фильтр пропустим на соответствии его владельца
    --- Добавлено ---
    Если тебя зацепило подпись Про то я в своем деле Про а программирование я осваиваю для себя и своего проекта
    --- Добавлено ---
    @Fell-x27 и мне не указывай огрызаться или нет.
     
  19. MRSgiba

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

    С нами с:
    22 дек 2017
    Сообщения:
    200
    Симпатии:
    32
    @Ruslanpro короче раз не програмист, то не запаривайся и не хами програмистам.
    Вот те код он рабочий, немного неправильный в плане того что ключи массива русские буквы, но работать будет:
    PHP:
    1. <?php
    2. $result = ['алмазная резка','автоматика','архитектура','барельеф','бетонные работы','бурение скважин','вентиляция','витражи','водопровод','гиодезия'];
    3. foreach ($result as $r) {
    4.     $letter_result[mb_substr($r,0,1)][]=$r;//создание массива буква=>[категории буквы]
    5. }
    6. //вывод
    7. foreach ($letter_result as $key=>$value) //перебор всех массивов буква=>категории этой буквы
    8.     {
    9.         echo "<p>$key</p>";//буква
    10.         foreach ($value as $v) {
    11.             echo "<p>$v</p>";//каждая категория для этой буквы
    12.         }
    13.     }
    14. ?>
    Используй его и не парься, станешь програмистом придумаешь правильный и не хами и не цепляйся к людям, ты пришел за помощью тебе помогают, хамить не надо, даже если ты считаешь что ты прав
     
    #44 MRSgiba, 10 дек 2018
    Последнее редактирование: 10 дек 2018
  20. Ruslanpro

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

    С нами с:
    17 мар 2017
    Сообщения:
    151
    Симпатии:
    6
    @MRSgiba я не люблю хамить до тех пор пока не начинают личность задевать. Неужели так сложно пройти мимо если не можешь поддержать советом и т.д.
    Спасибо за код
    --- Добавлено ---
    @MRSgiba почему тебе не нахомил или другим а именно ему. Я тут на форуме часто замечаю как программисты высокомерно отвечают тем у кого мало знания и не по теме . Тебе задают вопрос ответь конкретно по этому вопросу если не можешь оставь и дай ответить тем кто сможет
     
  21. MRSgiba

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

    С нами с:
    22 дек 2017
    Сообщения:
    200
    Симпатии:
    32
    @Ruslanpro я тебе скажу так, чтобы ответить на даже самый простой вопрос в нем нужно разобраться, и иногда разбор в этом вопросе занимает уйму времени (учитывая неразборчивость исходных данных), у нормальных программистов оно дорогое, и они просят автора вопроса максимально комфортно преподнести исходные данные, чтобы им было максимально комфортно, за минимальный временной отрезок дать максимально полный ответ.
     
    Fell-x27 и villiwalla нравится это.
  22. Ruslanpro

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

    С нами с:
    17 мар 2017
    Сообщения:
    151
    Симпатии:
    6
    Решил задачу на странице. Спасибо @villiwalla за код.
    Эта функция используется для того чтобы заменить входящие русские символы на английские
    PHP:
    1. function replaceSymbolRuToLat($symbol) {
    2.         $symbolsRu = [
    3.             'a' => 'a',
    4.             'б' => 'b',
    5.             'в' => 'v',
    6.             'г' => 'g',
    7.             'д' => 'd',
    8.             'е' => 'e',
    9.             'ё' => 'yo',
    10.             'ж' => 'zh',
    11.             'з' => 'z',
    12.             'и' => 'i',
    13.             'й' => 'y',
    14.             'к' => 'k',
    15.             'л' => 'l',
    16.             'м' => 'm',
    17.             'н' => 'n',
    18.             'о' => 'o',
    19.             'п' => 'p',
    20.             'р' => 'r',
    21.             'с' => 's',
    22.             'т' => 't',
    23.             'у' => 'u',
    24.             'ф' => 'f',
    25.             'х' => 'kh',
    26.             'ц' => 'ts',
    27.             'ч' => 'ch',
    28.             'ш' => 'sh',
    29.             'щ' => 'shch',
    30.             'ъ' => '"',
    31.             'ы' => '0',
    32.             'ь' => '0',
    33.             'э' => 'uh',
    34.             'ю' => 'yu',
    35.             'я' => 'ya',
    36.         ];
    37.         $symbol = mb_strtolower($symbol);
    38.         return $symbolsRu[$symbol];
    39.         echo $symbolsRu[$symbol];
    40.     }
    это сам код на странице где выводятся категории
    HTML:
    1. <?php
    2.  
    3.      
    4.        require_once "../config/function.php";
    5.        $sql = 'SELECT * FROM categories';
    6.      
    7.            $lastChar = null;
    8.          
    9.            foreach ($conndb->query($sql) as $row):
    10.          
    11.                 if ($lastChar !== ($currentChar = mb_convert_case(mb_substr($row['category_name'], 0, 1), CASE_UPPER))):
    12.      
    13.                     $lastChar = $currentChar;
    14.                  
    15.                  
    16.     ?>
    17.                  
    18.                     <h1 class="bukva" id="bukva_<? echo replaceSymbolRuToLat($lastChar); ?>"><? echo mb_convert_case($lastChar, CASE_LOWER); ?></h1>
    19.      
    20.     <?php
    21.              
    22.                endif;
    23.          
    24.    ?>
    25.              
    26.             <a href="http://localhost/menu_general/masters_page/masters/masters.php">
    27.      
    28.                 <div class="kategoriya">
    29.                     <div class="kolichestvo">0</div>
    30.                     <?php echo $row['category_name'] . "\t"; ?>
    31.                 </div>
    32.          
    33.             </a>
    34.  
    35.     <?php
    36.  
    37.            endforeach;
    38.  
    39.    ?>
    только тут надо исправить чтобы функция выводила первую букву А в id="bukva_<? echo replaceSymbolRuToLat($lastChar); ?>"
     
  23. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    [​IMG]