Нормальное ли решение? Есть ли по лучше? Дан текстареа и кнопка. В текстареа через пробел вводятся слова. По нажатию на кнопку выведите слова в таком виде: сначала заголовок 'слова на букву а' и под ним все слова, которые начинаются на 'а', потом заголовок 'слова на букву б' и все слова на 'б' и так далее. Буквы должны идти в алфавитном порядке. Брать следует только те буквы, на которые начинаются наши слова. То есть: если нет слов, к примеру, на букву 'в' - такого заголовка тоже не будет. PHP: echo ' <form method="get" action=""> <textarea name="words" cols="30" rows="5"></textarea> <input type="submit" value="Отсортировать"> </form> '; if(!empty($_GET['words'])) { $alphabet = ['а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я']; //$str = 'яблоко стул машина компьютер школа арбуз пельмени ключ душ мангал квартира сырость ананас'; $str = $_GET['words']; $arr = explode(' ', $str); sort($arr); $values = []; $i = 0; foreach($alphabet as $chr){ foreach($arr as $word){ if(mb_strpos($word, $chr, 0) === 0) { $values[$chr][$i] = $word; $i++; } } } foreach($values as $letter => $val) { echo '<strong>Слова на букву ' . $letter . ':</strong><br>'; foreach($val as $slova) { echo $slova . '<br>'; } echo '<br>'; } }
Я бы чуть по-другому сделал, но разница невелика: PHP: <form method="get" action=""> <textarea name="words" cols="30" rows="5"></textarea> <input type="submit" value="Отсортировать"> </form> <?php if($_GET['words']): $words = explode(' ', $_GET['words']); sort($words); foreach($words as $word): $result[mb_substr($word,0,1,"UTF-8")][] = $word; endforeach; foreach($result as $key => $items): echo '<strong>Слова на букву ' . $key . ':</strong><br>'. implode('<br>', $items).'<br>'; endforeach; endif; ?>
проверил? сорт функц Код (Text): Замечание: Эта функция присваивает новые ключи элементам массива. Она удалит все существующие ключи, а не просто переупорядочит их. Лови говнокод PHP: <?php error_reporting(E_ALL); $str = 'яблоко стул машина компьютер школа арбуз ПЕЛЬМЕШКИ ключ душ мангал квартира сырость ананас'; $a = []; foreach ( explode ( ' ', $str ) AS $fruit ) { $a[mb_substr ( mb_strtolower ( $fruit ), 0, 1 )][] = $fruit; } ksort ( $a ); print_r ($a); Код (Text): Array ( [а] => Array ( [0] => арбуз [1] => ананас ) [д] => Array ( [0] => душ ) [к] => Array ( [0] => компьютер [1] => ключ [2] => квартира ) [м] => Array ( [0] => машина [1] => мангал ) [п] => Array ( [0] => ПЕЛЬМЕШКИ ) [с] => Array ( [0] => стул [1] => сырость ) [ш] => Array ( [0] => школа ) [я] => Array ( [0] => яблоко ) ) --- Добавлено --- + if ( isset ( $_GET['fruits'] ) )
@Dimon2x Зря спрашиваешь, он кросавчик, знает свое дело, это не он решает что это говнокод, это его подсознание, он хочет сделать лучше но все ровно ему код не нравится, повторяюсь он на любой код смотрит и считает его говнокодом, так что можешь не спрашивать его. @MouseZver кросавчик, в программировании зверь, реальный зверь
Все правильно. Сначала из строки получаем индексируемый массив со словами, потом сортируем его по алфавиту. А потом уже циклом перегоняем в массив с ключом по первой букве. У тебя в примере слова идут не по алфавиту: PHP: [а] => Array ( [0] => арбуз [1] => ананас ) А должно быть: PHP: [а] => Array ( [0] => ананас [1] => арбуз )
Код: PHP: <?php $str = 'яблоко стул машина компьютер школа арбуз ПЕЛЬМЕШКИ ключ душ мангал квартира сырость ананас'; $array = explode(' ',$str); $result = []; usort($array, function($val1, $val2){ return strcmp( mb_strtolower($val1), mb_strtolower($val2) ); }); foreach ($array as $element){ $result[mb_substr(mb_strtolower( $element ), 0, 1)][] = $element; } var_dump($result); Результат: PHP: array(8) { ["а"]=> array(2) { [0]=> string(12) "ананас" [1]=> string(10) "арбуз" } ["д"]=> array(1) { [0]=> string(6) "душ" } ["к"]=> array(3) { [0]=> string(16) "квартира" [1]=> string(8) "ключ" [2]=> string(18) "компьютер" } ["м"]=> array(2) { [0]=> string(12) "мангал" [1]=> string(12) "машина" } ["п"]=> array(1) { [0]=> string(18) "ПЕЛЬМЕШКИ" } ["с"]=> array(2) { [0]=> string(8) "стул" [1]=> string(14) "сырость" } ["ш"]=> array(1) { [0]=> string(10) "школа" } ["я"]=> array(1) { [0]=> string(12) "яблоко" } } --- Добавлено --- 1) sort/asort и иже с ними сравнивают строки как есть, и у тебя получается, что капсовые пельмешки стоят выше буквы А. 2) Не используй bash-like синтаксис. От него пахнет нафталином. PHP - сиподобный язык уже сто лет. Пиши нормально. Я вообще удивлен, что старый синтаксис еще работает. Это ж версия третья, наверное, кабы не вторая даже. --- Добавлено --- Да, я в курсе, что существует strcasecmp, и даже сначала хотел ее заюзать, да только она с мультибайтом работает хреново, так что пришлось костылить.
В твоем коде изначально заложена низкая планка гибкости. А если там будут слова на латинице? А если с цифрами? Вот и приехали. Ты привязался к конкретике и стал идти от нее. Так делать нельзя. Надо быть абстрагированным настолько, насколько это возможно.
спасибо. поскольку долго искал подходящее, чтобы увеличить шанс, что и другие найдут эту страницу привожу мою строку поиска : php сортировка массива слов новый массив вывести по буквам. при некотором изменении переменных сравнения сортировать можно и массивы. например Код (Text): $val1["name_field"] и $val2["name_field"] и соответственно Код (Text): $result[mb_substr(mb_strtolower( $element["name_field"] ), 0, 1)][] = $element;