Вывод элементов массива по первой букве

Serj190492

Новичок
Всем привет!
Есть массив, в котором заданы области и города в них.
Вот он:
PHP:
$reg = array(
    'Московская' => array('Москва', 'Зеленоград', 'Клин'),
    'Ленинградская' => array('Санкт-Петербург', 'Всеволожск', 'Павловск', 'Кронштадт'),
    'Томская' => array('Колпашево', 'Томск', 'Чажемто'));
СтоИт задача - вывести города, начинающиеся на определенную букву, например К.

Нашел в интернете, что это можно сделать функцией substr. Но не могу разобраться, как работает эта функция:
по моему мнению должно быть так:

PHP:
foreach ($reg as $obl => $region) {
    echo "<h1>$obl область:</h1>";
    foreach ($region as $sity) {
        if (substr($sity, 0, 1) == "К") {
            echo "$sity<br/>";
        }
    }
}
Но работает только если третий аргумент функции "2"... Т.е. вот так:
PHP:
foreach ($reg as $obl => $region) {

    echo "<h1>$obl область:</h1>";
    foreach ($region as $sity) {
        if (substr($sity, 0, 2) == "К") {
            echo "$sity<br/>";
        }
    }
}
Что это за двойка? Почему не работает с единицей?) Объясните новичку?!)

PS.
Еще думал, что $sity - это массив символов, пробовал так - тоже не выводит. Т.е. я не прав, это не массив символов?)

PHP:
foreach ($reg as $obl => $region) {
    echo "<h1>$obl область:</h1>";
    foreach ($region as $sity) {
        if ($sity[0] == "К") {
            echo "$sity<br/>";
        }
    }
}
 

artoodetoo

великий и ужасный
city пишется с буквы Си
если твой текст в кодировке UTF-8 (надеюсь что так), то кириллические буквы занимают 2 байта. пользуйся mb_* функциями чтобы работать с мультибайтными строками
строго говоря, строка это не массив. хотя местами синтаксис совпадает
 

Serj190492

Новичок
city пишется с буквы Си...
Пардон, исправлюсь)

...если твой текст в кодировке UTF-8 (надеюсь что так)...
было так, но там не всё работало, пришлось перевести в 1251...

пользуйся mb_* функциями чтобы работать с мультибайтными строками
Пробовал mb_substr, разницы не ощутил, те же аргументы работают.

строго говоря, строка это не массив. хотя местами синтаксис совпадает
Из-за того, что документ был сохранен в utf-8, он почему-то распознавал кириллицу неправильно: $text = "это пример текста"; echo $text[2] выводило на экран ромб с вопросом.
Поэтому и пришлось сохранить в 1251.
 

artoodetoo

великий и ужасный
было так, но там не всё работало, пришлось перевести в 1251...
echo $text[2] выводило на экран ромб с вопросом.
Поэтому и пришлось сохранить в 1251.
это фэйл! :D если так убегать от трудностей, они тебя всё равно догонят.
"на экран" это на вебстраничке? надо чтобы браузер понимал с какой кодировкой работает. для этого есть заголовки.
 

artoodetoo

великий и ужасный
всегда работай с utf-8! это современный стандарт. и только в очень специфических задачах входящие/исходящие данные конвертируй из/в иные кодировки.
 

Serj190492

Новичок
Ну закидали)) Не давите на новичка, я второй день изучаю пхп))

всегда работай с utf-8! это современный стандарт. и только в очень специфических задачах входящие/исходящие данные конвертируй из/в иные кодировки.
Помогите тогда разобраться:( Работаю в OpenServer.
Вот скрин настройки OS + часть кода + вывод на экран:
 

Вложения

artoodetoo

великий и ужасный
не буду. тема слишком заезженная, чтобы я тут капитанил. ты ведь даже не попытался вникнуть в заголовки про кодировку?
 

artoodetoo

великий и ужасный
мой совет: начни с простого: добейся чтобы статический текст в UTF-8 выводился правильно. потом добавь туда что-то вычисляемое и т.д. …
сам!
 

Serj190492

Новичок
ты ведь даже не попытался вникнуть
Я добавил вначале файла
PHP:
header('Content-Type: text/html; charset=utf-8');
Документ сохранил в UTF-8. Но вывод не работает.

Статический текст выводит без проблем.

А вот echo "$text[2]"; -- не работает...
 
Последнее редактирование:

artoodetoo

великий и ужасный
вот echo "$text[2]"; -- не работает...
Ну естественно. Эта конструкция берет не букву, а байт. Русская буква занимает два байта. Ты меня игнорируешь? :) Используй mb_*. Читай доки, вникай, проводи простые тесты.
 
Последнее редактирование:
Сверху