t-alexashka
@t-alexashka
Сразу пишу legacy код

В PHP не получается вывести список городов группированный по первой букве?

Тащу список городов из базы, хочу вывести сгруппировав по первой букве города. Но выводится только 1 символ, и весь список за ним..

$array = []; 
			$return = '';
			
			
			while($city = $result->fetch_assoc()){
				$array[$city['city_name'][0])][] = $city;
			}
				
			foreach($array as $symbol  => $sub_array)
			{
				$return .= '<h3>' . $symbol . '</h3><ul>';
				foreach($sub_array as $city)
				{
					$return .= '<li>'. $city['city_name'] .'</li>';
				}
				$return .= '</ul>';
			}
			
			return $return;


77144f8167ca4e9f836f62eb9d8f0904.PNG

Что я не так делаю?

Файл php и база в utf-8 кодировке если что.
  • Вопрос задан
  • 2622 просмотра
Решения вопроса 2
...
while($city = $result->fetch_assoc()) {
    $array[mb_substr($city['city_name'], 0, 1, 'UTF-8')][] = $city;
}
...
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Все дело в юникоде и в том как PHP с ним работает. В частности когда вы получаете первый символ строки, вы забираете только его часть (так как это мультибайт стринг и все такое).

Для того что бы все корректно работало стоит использовать mb_string. Так же в php есть опеределнные нюансы в плане хранения ассоциативных массивов, в частности кодировка ключей.

Для того что бы проблем небыло совсем, стоит отказаться от использования ассоциативных массивов для этой задачи. Пример:

function build_index($words)
{
        $index = [];
        $current = null;
        foreach($words as $word) {
                $firstLetter = mb_strtolower(mb_substr($word, 0, 1, 'utf-8'), 'utf-8');
                if (!$current || $current['letter'] !== $firstLetter) {
                        $index[] = [
                                'letter' => $firstLetter,
                                'data' => []
                        ];
                        $current = &$index[count($index)-1];
                }
                $current['data'][] = $word;
        }

        return $index;
}


Демо: ideone.com/nUSWZ3
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
30 апр. 2024, в 22:44
500 руб./в час
30 апр. 2024, в 21:45
20000 руб./за проект
30 апр. 2024, в 21:36
1500 руб./в час