За последние 24 часа нас посетили 49829 программистов и 13519 роботов. Сейчас ищут 2039 программистов ...

Отсортировать слова по алфавиту и вывести их

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

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    Нормальное ли решение?

    Есть ли по лучше?

    Дан текстареа и кнопка. В текстареа через пробел вводятся слова. По нажатию на кнопку выведите слова в таком виде: сначала заголовок 'слова на букву а' и под ним все слова, которые начинаются на 'а', потом заголовок 'слова на букву б' и все слова на 'б' и так далее. Буквы должны идти в алфавитном порядке. Брать следует только те буквы, на которые начинаются наши слова. То есть: если нет слов, к примеру, на букву 'в' - такого заголовка тоже не будет.

    PHP:
    1. echo '
    2.    <form method="get" action="">
    3.        <textarea name="words" cols="30" rows="5"></textarea>
    4.        <input type="submit" value="Отсортировать">
    5.    </form>
    6. ';
    7.  
    8. if(!empty($_GET['words'])) {
    9.     $alphabet = ['а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я'];
    10.  
    11.  
    12. //$str = 'яблоко стул машина компьютер школа арбуз пельмени ключ душ мангал квартира сырость ананас';
    13.  
    14. $str = $_GET['words'];
    15.  
    16. $arr = explode(' ', $str);
    17.  
    18. sort($arr);
    19.  
    20. $values = [];
    21.  
    22. $i = 0;
    23. foreach($alphabet as $chr){
    24.     foreach($arr as $word){
    25.        
    26.         if(mb_strpos($word, $chr, 0) === 0) {
    27.             $values[$chr][$i] = $word;
    28.             $i++;
    29.         }
    30.     }
    31.  
    32. }
    33.  
    34. foreach($values as $letter => $val) {
    35.     echo '<strong>Слова на букву ' . $letter . ':</strong><br>';
    36.     foreach($val as $slova) {
    37.         echo $slova . '<br>';
    38.     }
    39.    
    40.     echo '<br>';
    41.    
    42.     }
    43. }
     
  2. Sergey_Tsarev

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

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Я бы чуть по-другому сделал, но разница невелика:
    PHP:
    1. <form method="get" action="">
    2.        <textarea name="words" cols="30" rows="5"></textarea>
    3.        <input type="submit" value="Отсортировать">
    4. </form>
    5. <?php
    6. if($_GET['words']):
    7.  
    8.     $words = explode(' ', $_GET['words']);
    9.     sort($words);
    10.  
    11.     foreach($words as $word):
    12.         $result[mb_substr($word,0,1,"UTF-8")][] = $word;
    13.     endforeach;
    14.  
    15.     foreach($result as $key => $items):
    16.         echo '<strong>Слова на букву ' . $key . ':</strong><br>'. implode('<br>', $items).'<br>';    
    17.     endforeach;
    18. endif;
    19. ?>
     
    #2 Sergey_Tsarev, 30 сен 2017
    Последнее редактирование: 30 сен 2017
    Dimon2x нравится это.
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.841
    Симпатии:
    1.338
    Адрес:
    Лень
    проверил?
    сорт функц
    Код (Text):
    1.     Замечание: Эта функция присваивает новые ключи элементам массива. Она удалит все существующие ключи, а не просто переупорядочит их.
    Лови говнокод
    PHP:
    1. <?php
    2.  
    3.  
    4. $str = 'яблоко стул машина компьютер школа арбуз ПЕЛЬМЕШКИ ключ душ мангал квартира сырость ананас';
    5.  
    6. $a = [];
    7.  
    8. foreach ( explode ( ' ', $str ) AS $fruit )
    9. {
    10.     $a[mb_substr ( mb_strtolower ( $fruit ), 0, 1 )][] = $fruit;
    11. }
    12.  
    13. ksort ( $a );
    14.  
    15. print_r ($a);
    Код (Text):
    1. Array
    2. (
    3.     [а] => Array
    4.         (
    5.             [0] => арбуз
    6.             [1] => ананас
    7.         )
    8.  
    9.     [д] => Array
    10.         (
    11.             [0] => душ
    12.         )
    13.  
    14.     [к] => Array
    15.         (
    16.             [0] => компьютер
    17.             [1] => ключ
    18.             [2] => квартира
    19.         )
    20.  
    21.     [м] => Array
    22.         (
    23.             [0] => машина
    24.             [1] => мангал
    25.         )
    26.  
    27.     [п] => Array
    28.         (
    29.             [0] => ПЕЛЬМЕШКИ
    30.         )
    31.  
    32.     [с] => Array
    33.         (
    34.             [0] => стул
    35.             [1] => сырость
    36.         )
    37.  
    38.     [ш] => Array
    39.         (
    40.             [0] => школа
    41.         )
    42.  
    43.     [я] => Array
    44.         (
    45.             [0] => яблоко
    46.         )
    47.  
    48. )
    --- Добавлено ---
    +
    if ( isset ( $_GET['fruits'] ) )
     
    Dimon2x нравится это.
  4. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    А почему это говнокод?
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.841
    Симпатии:
    1.338
    Адрес:
    Лень
    всегда есть компактный вариант с использованием print или иное ссылки
     
  6. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Dimon2x
    Зря спрашиваешь, он кросавчик, знает свое дело, это не он решает что это говнокод, это его подсознание, он хочет сделать лучше но все ровно ему код не нравится, повторяюсь он на любой код смотрит и считает его говнокодом, так что можешь не спрашивать его. @MouseZver кросавчик, в программировании зверь, реальный зверь :D
     
  7. Sergey_Tsarev

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

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Все правильно. Сначала из строки получаем индексируемый массив со словами, потом сортируем его по алфавиту. А потом уже циклом перегоняем в массив с ключом по первой букве. У тебя в примере слова идут не по алфавиту:
    PHP:
    1.     [а] => Array
    2.         (
    3.             [0] => арбуз
    4.             [1] => ананас
    5.         )
    А должно быть:
    PHP:
    1.     [а] => Array
    2.         (
    3.             [0] => ананас
    4.             [1] => арбуз
    5.         )
     
  8. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.012
    Симпатии:
    1.679
    Адрес:
    :сердА
    Код:
    PHP:
    1. <?php
    2. $str = 'яблоко стул машина компьютер школа арбуз ПЕЛЬМЕШКИ ключ душ мангал квартира сырость ананас';
    3. $array = explode(' ',$str);
    4. $result = [];
    5. usort($array, function($val1, $val2){
    6.     return strcmp(
    7.         mb_strtolower($val1),
    8.         mb_strtolower($val2)
    9.         );
    10. });
    11.  
    12. foreach ($array as $element){
    13.     $result[mb_substr(mb_strtolower( $element ), 0, 1)][] = $element;
    14. }
    15.  
    16. var_dump($result);
    Результат:
    PHP:
    1. array(8) {
    2.   ["а"]=>
    3.   array(2) {
    4.     [0]=>
    5.     string(12) "ананас"
    6.     [1]=>
    7.     string(10) "арбуз"
    8.   }
    9.   ["д"]=>
    10.   array(1) {
    11.     [0]=>
    12.     string(6) "душ"
    13.   }
    14.   ["к"]=>
    15.   array(3) {
    16.     [0]=>
    17.     string(16) "квартира"
    18.     [1]=>
    19.     string(8) "ключ"
    20.     [2]=>
    21.     string(18) "компьютер"
    22.   }
    23.   ["м"]=>
    24.   array(2) {
    25.     [0]=>
    26.     string(12) "мангал"
    27.     [1]=>
    28.     string(12) "машина"
    29.   }
    30.   ["п"]=>
    31.   array(1) {
    32.     [0]=>
    33.     string(18) "ПЕЛЬМЕШКИ"
    34.   }
    35.   ["с"]=>
    36.   array(2) {
    37.     [0]=>
    38.     string(8) "стул"
    39.     [1]=>
    40.     string(14) "сырость"
    41.   }
    42.   ["ш"]=>
    43.   array(1) {
    44.     [0]=>
    45.     string(10) "школа"
    46.   }
    47.   ["я"]=>
    48.   array(1) {
    49.     [0]=>
    50.     string(12) "яблоко"
    51.   }
    52. }
    --- Добавлено ---
    1) sort/asort и иже с ними сравнивают строки как есть, и у тебя получается, что капсовые пельмешки стоят выше буквы А.
    2) Не используй bash-like синтаксис. От него пахнет нафталином. PHP - сиподобный язык уже сто лет. Пиши нормально. Я вообще удивлен, что старый синтаксис еще работает. Это ж версия третья, наверное, кабы не вторая даже.
    --- Добавлено ---
    Да, я в курсе, что существует strcasecmp, и даже сначала хотел ее заюзать, да только она с мультибайтом работает хреново, так что пришлось костылить.
     
    #8 Fell-x27, 30 сен 2017
    Последнее редактирование: 30 сен 2017
    Dimon2x нравится это.
  9. Sergey_Tsarev

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

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Да если не принципиально, то можно перевести все слова в нижний регистр и костылей никаких не нужно :)
     
  10. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.012
    Симпатии:
    1.679
    Адрес:
    :сердА
    Если задача - отсортировать входящие данные, а не отсортировать и изменить, то принципиально.
     
  11. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.012
    Симпатии:
    1.679
    Адрес:
    :сердА
    В твоем коде изначально заложена низкая планка гибкости. А если там будут слова на латинице? А если с цифрами? Вот и приехали. Ты привязался к конкретике и стал идти от нее. Так делать нельзя. Надо быть абстрагированным настолько, насколько это возможно.
     
  12. romanown

    romanown Новичок

    С нами с:
    5 мар 2019
    Сообщения:
    1
    Симпатии:
    0
    спасибо. поскольку долго искал подходящее, чтобы увеличить шанс, что и другие найдут эту страницу привожу мою строку поиска : php сортировка массива слов новый массив вывести по буквам. при некотором изменении переменных сравнения сортировать можно и массивы. например
    Код (Text):
    1. $val1["name_field"]
    2.  и $val2["name_field"]
    и соответственно
    Код (Text):
    1. $result[mb_substr(mb_strtolower( $element["name_field"] ), 0, 1)][] = $element;