Циклом пройтись, через preg_match () проверить первую букву, в каждой итерации проверять, не поменялась ли буква. Цикл добавляет в двухмерный массив переменную.
PHP: $array = ["Абсент", "Водка", "Ликёр", "Пиво", "Саке"]; $letter = 1; $sorted = [][]; foreach ($array as $item) { $first = $item[0]; //Заменяем первую букву на заглавную на всякий случай. $last = mb_substr($item,1); $first = mb_strtoupper($first, 'UTF-8'); $item = $first.$last; array_push ($sorted[$first], $item); } По логике должно работать, но я не тестировал.
Да не,я не про [],а про [][],это так то Fatal Error) Если уж на то дело пошло, то PHP: $arr = array(array());
Короче, хватит выделоваться) Нашёл по первому запрос в гугле: PHP: function sorting( & $array ) { $memory = NULL; $sorting = array(); foreach( $array as $item ) { $letter = mb_substr( $item, 0, 1, 'utf-8' ); if( $letter != $memory ) { $memory = $letter; $sorting[$memory] = array(); } $sorting[$memory][] = $item; } $array = $sorting; return ($array); } $array = [ "Вино", "Абсент", "Водка", "Ликёр", "Сидр", "Пиво", "Саке"]; asort($array); $array = sorting ($array); print_r ($array);
PHP: $arr = array("Aaaa", "Abbbbb", "acCccc", "Baaaaa", "bbbbbb", "Fcdsccc", "Zfdflfd", "Zzzzzzz"); for ($i = 0; $i <= count($arr)-1; $i++) { if (mb_strtolower($arr[$i][0]) != mb_strtolower($arr[$i-1][0])) { echo "<b>",$arr[$i][0],"</b><br>",$arr[$i],"<br>"; } else echo $arr[$i],"<br>"; } Спойлер: Результат A Aaaa Abbbbb acCccc B Baaaaa bbbbbb F Fcdsccc Z Zfdflfd Zzzzzzz
PHP: $arr = array( 'Zfdflfd', 'Aaaa', 'Abbbbb', 'acCccc', 'Baaaaa', 'bbbbbb', 'Fcdsccc', 'Zzzzzzz'); $catalog = array_reduce($arr, function ($carry, $item) { $carry[strtoupper($item{0})][] = $item; return $carry; }, array()); ksort($catalog); var_dump($catalog); Не стоит каждую итерацию вычислять count массива Для юникода соответсвенно функции с приставкой mb_
Ты же наверное из бд циклом выводишь всё это дело. Можно в тот же цикл всё это дело запихать и сделать за один прогон, чтобы циклы не плодить и время обработки не увеличивать.
"Если рядом воробей, мы готовим пушку"(с). Регулярки ради первой буквы - это что-то новое. В php хренова туча функций для работы со строками, которые позволяют в 95% случаев обходиться вовсе без регулярок. Которые работают в разы быстрее регулярок. Их юзать надо. И да, использование вот такого доступа к первой букве: Код (Text): $arr[$i][0] $item{0} Не фонтан. @Poznakomlus не забыл упомянуть про mb_ для мультибайтовых кодировок, а вот про то, что обращение по индексу символа для мультибайта не работает, забыл. Суть в том, что $string[$index] это не обращение к символу. Это обращение к байту. Вбейте в обрабатываемый массив кириллицу, и все сломается, потому что $string[0] возьмет не первую букву, а "половинку" первой буквы, и интерпретирует этот байт как самостоятельный символ. Для вытаскивания символов из строк, где может быть кириллица, используйте mb_substr. А еще, можно кроме функций для обходов массива неявным циклом, использовать такую конструкцию: PHP: for($i=0, $limit = count($arr); $i < $limit; $i++){} И да, автор если не брать в расчет избыточность самой конструкции, дергающей пересчет длины массива, зачем делать $i<=count($arr)-1, если можно просто $i<count($arr) ? Сравни PHP: for($i=0, $limit = count($arr); $i < $limit; $i++){} и PHP: for($i=0, $limit = count($arr); $i <= $limit-1; $i++){} Второй вариант, сдается мне, выглядит страннее.
Согласен, погорячился я с регуляркой, просто как раз изучал регулярки недавно, и вспомнил что там есть такая возможность, определить первую букву, но когда начал делать - осознал