Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
1 / 1 / 0
Регистрация: 16.01.2018
Сообщений: 10
1

SWITCH

07.10.2021, 14:25. Показов 1205. Ответов 15

Author24 — интернет-сервис помощи студентам
Столкнулся с такой проблемой:
Получаю данные с помощью апи от телеграма, вся работа с текстом проходит на ура, но когда нужно разорвать и по определенным критерия провести индексацию код ниже:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
$text = $update['message']['text'] ?? '';
switch ($text):
 case '/start':
        $response = $telegram->sendMessage([
            'chat_id' => $chat_id,
            'text' => "Привет, {$update['message']['chat']['first_name']}! Я бот, помогающий вести домашнюю бухгалтерию. Для получения справки отправьте команду /help или нажмите соответствующую кнопку на клавиатуре ниже.",
            'parse_mode' => 'HTML',
            'reply_markup' => $telegram->replyKeyboardMarkup([
                'keyboard' => $start_keyboard,
                'resize_keyboard' => true,
            ])
        ]);
        break;
    case 'Help': case '/help':
        $response = $telegram->sendMessage([
            'chat_id' => $chat_id,
            'text' => "Для ведения учета просто добавьте свой доход или расход в следующем формате:
<b>Тип: сумма - категория</b>
<u>Примеры команд:</u>
Доход: 1000 - Зарплата
Расход: 1000 - Коммунальные услуги",
            'parse_mode' => 'HTML',
            'reply_markup' => $telegram->replyKeyboardMarkup([
                'keyboard' => $start_keyboard,
                'resize_keyboard' => true,
            ])
        ]);
        break;
    case 'Категории доходов':
        $data = get_categories(1);
        $answer = '<u>Категории доходов:</u>' . PHP_EOL . $data;
        $response = $telegram->sendMessage([
            'chat_id' => $chat_id,
            'text' => $answer,
            'parse_mode' => 'HTML',
            'reply_markup' => $telegram->replyKeyboardMarkup([
                'keyboard' => $start_keyboard,
                'resize_keyboard' => true,
            ])
        ]);
        break;
    case 'Категории расходов':
        $data = get_categories(0);
        $answer = '<u>Категории доходов:</u>' . PHP_EOL . $data;
        $response = $telegram->sendMessage([
            'chat_id' => $chat_id,
            'text' => $answer,
            'parse_mode' => 'HTML',
            'reply_markup' => $telegram->replyKeyboardMarkup([
                'keyboard' => $start_keyboard,
                'resize_keyboard' => true,
            ])
        ]);
        break;
До этого момента все отрабатывает как по маслу, после же не срабатывает код, ответ от телеграмма есть...
А вот ответа от скрипта нету, ошибок PHPstorm не выдает, хостинг так же не показывает никаких ошибок, возможно что в ветвлении switch нельзя использовать preg_match?
PHP
1
2
3
4
5
6
7
8
9
10
11
    case (preg_match("#^Доход: (\d+) - ([\w ]+)#u", $text, $matches)):
        $response = $telegram->sendMessage([
            'chat_id' => $chat_id,
            'text' => "Сумма: {$matches[1]} | Категория: {$matches[2]}",
            'parse_mode' => 'HTML',
            'reply_markup' => $telegram->replyKeyboardMarkup([
                'keyboard' => $start_keyboard,
                'resize_keyboard' => true,
            ])
        ]);
        break;
Точно знаю, что не заходит в эту проверку и уходит в дефолт:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
   default:
        $response = $telegram->sendMessage([
            'chat_id' => $chat_id,
            'text' => "Извините, но я вас не понял :-(
<b>Воспользуйтесь командой /help</b>",
            'parse_mode' => 'HTML',
            'reply_markup' => $telegram->replyKeyboardMarkup([
                'keyboard' => $start_keyboard,
                'resize_keyboard' => true,
            ])
        ]);
        break;
    endswitch;
Добавлено через 13 минут
Нашел решение,
в кейсе при проверке добавляем

PHP
1
case (preg_match("#^Доход: (\d+) - ([\w ]+)#u", $text, $matches)? true : false):
Но хотелось бы разобраться что именно я сделал (нашел подобную проблему на англоязычном форуме),
MyEnglish = -1;

Кто разбирается, объясните пожалуйста, и не кидайте тапками, я только учусь.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2021, 14:25
Ответы с готовыми решениями:

Радио группа и Switch
Имеем радио группу &lt;label&gt;&lt;input type=&quot;radio&quot; name=&quot;type&quot; value=&quot;op1&quot;...

Изменить case в switch
Подскажите пожалуйста, как это решить. $a = 1; switch ($a) { case &quot;1&quot;: { какой-то код;...

«Оператор выбора (switch case) в php»
По введенному числу от 0 до 15 вывести название цвета, соответствующего этому коду

Не пойму странную логику работы switch в цикле
Приветствую друзья! Смотрите, есть такой код: &lt;?php for ($i = 0; $i &lt; 30; $i++) { ...

15
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
07.10.2021, 14:40 2
preg_match() возвращает 1, если параметр pattern соответствует переданному параметру subject, 0 если нет или false в случае возникновения ошибки.
https://www.php.net/manual/ru/... turnvalues

Следовательно, тело этого case выполнится только при $text равной 0 (нулю) или другому значению, которое при приведении типов сможет стать нулём.

Добавлено через 3 минуты
Цитата Сообщение от Yaroslav_Fil Посмотреть сообщение
Нашел решение, в кейсе при проверке добавляем
При приведении типа к bool заполненная строка приведётся к true (если в ней не одна цифра -- ноль), поэтому условие выполнится, если preg_match вернёт 1.
1
1 / 1 / 0
Регистрация: 16.01.2018
Сообщений: 10
07.10.2021, 14:42  [ТС] 3
Цитата Сообщение от Para bellum Посмотреть сообщение
Следователь
PHP
1
case (preg_match("#^Доход: (\d+) - ([\w ]+)#u", $text, $matches)? true : false)
Почему при такой интерпретации начинает работать все? И где можно посмотреть описание этой конструкции?
PHP
1
 ? true : false
Спасибо!
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
07.10.2021, 14:43 4
Выше дополнил сообщение, гляньте.
1
1 / 1 / 0
Регистрация: 16.01.2018
Сообщений: 10
07.10.2021, 14:43  [ТС] 5
По сути, как я понял из последнего сообщения,
PHP
1
? true : false
это приведение типов?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
07.10.2021, 15:13 6
Цитата Сообщение от Yaroslav_Fil Посмотреть сообщение
это приведение типов?
Нет. Приведение типов производится самим PHP при сравнении, скажем, bool-значения со строкой.

Смотрите. Когда не было указано этих true/false и preg_match возвращал единицу, то в case значение переменной $text сравнивалось с единицей. А когда строка, не начинающаяся с единицы сравнивается с единицей, условие не выполнится, будет false.

А когда вы указали true/false, при возврате функцией preg_match единицы в case значение переменной $text сравнивается уже с true, а не с единицей. А любая заполненная строка, не равная нулю, при сравнении с bool становится "true".

Добавлено через 19 минут
Добавлю: решение это так себе... Работает оно вопреки здравому смыслу.
Т.е. весь блок switch работает на сравнение $text с определённым значением. А в данном case мы делаем проверку той же переменной вне switch, заставляя затем switch сравнивать строку с bool.

В общем, тут тонкая грань.
Лучше было бы такую проверку делать в отдельном if или переделать switch вот так:
PHP
1
2
3
4
5
6
7
8
switch (true):
    case $text == '/start':
        // ...
        break;
    case preg_match("#^Доход: (\d+) - ([\w ]+)#u", $text):
         // ...
        break;
endswitch;
0
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
07.10.2021, 17:45 7
Цитата Сообщение от Para bellum Посмотреть сообщение
Лучше было бы такую проверку делать в отдельном if или переделать switch вот так:
Лучше сразу бить молотком по пальцам, не давая такое писать.
0
1 / 1 / 0
Регистрация: 16.01.2018
Сообщений: 10
08.10.2021, 10:43  [ТС] 8
Странное суждение, дико интересно. Вы сразу пришли в программирование мультипрофессионалом? И уже в первые дни писали проекты на уровне сеньёра? Если нет, и вам нечем помочь в этой теме, пожалуйста не пишите ерунду.
1
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
08.10.2021, 15:15 9
Цитата Сообщение от Yaroslav_Fil Посмотреть сообщение
Вы сразу пришли в программирование мультипрофессионалом?

Причём тут программирование ? Тут логика нужна. Если человек не может разработать свою логику, то ему практически нигде нет места.


Почему у вас нет логики? Потому что вы логически не можете подумать, что логику надо разбить на 2 этапа. Первый этап, когда вы разбиваете принятия команд, а второй этапа (В данном случае в switch - default) обработка ввода текста пользователя.

Вы же, прекрасно понимаете что, switch это оператор выбора case, пытаетесь туда засунуть проверку, заставляя имитировать работу else - if

Добавлено через 2 минуты
Цитата Сообщение от OpXiv Посмотреть сообщение
Тут логика нужна.
Если вы на бумажке не можете представить себе, как это может логически работать.

То как раз таки, это первый путь, не программировать.
0
Jodah
08.10.2021, 16:19
  #10

Не по теме:

Цитата Сообщение от OpXiv Посмотреть сообщение
Если вы на бумажке не можете представить себе, как это может логически работать.
То как раз таки, это первый путь, не программировать.
Не согласен. Не зря Джобс призывал учить программированию в школе. Потому что оно как раз учит мыслить.

0
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
08.10.2021, 16:20 11
Цитата Сообщение от Jodah Посмотреть сообщение
Джобс призывал учить программированию в школе.
Да, было актуально во времена Джобса. Когда не было нормального интернета. И не было книжек. Ибо толстосумы ещё не написали свои тома. А те что были, были составлены людьми, которые только познавали - только изобретённый мир программирования.

Да и в добавок, япы были все сложные на тот момент.

А пыха - самый лёгкий язык на свете. Мне кажется даже человек с 6 видом обучения, сможет на нём писать.
0
68 / 60 / 18
Регистрация: 03.12.2010
Сообщений: 365
08.10.2021, 17:17 12
Лучший ответ Сообщение было отмечено Yaroslav_Fil как решение

Решение

Цитата Сообщение от Yaroslav_Fil Посмотреть сообщение
И уже в первые дни писали проекты на уровне сеньёра?
Я вам больше скажу, если программист сам себя не развивает, то у него может быть хоть 10 лет стажа, а лучше писать он не станет.
1
1 / 1 / 0
Регистрация: 16.01.2018
Сообщений: 10
11.10.2021, 15:53  [ТС] 13
Именно поэтому чтобы развиваться я пришел на форум и задаю вопросы, ради того чтобы понять где и в чем я ошибаюсь. Стажа как такого в программировании 0, и нету человека в реальном виде чтобы подойти и поговорить почему так а почему эдак, а "уважаемые" пользователи форума пытаются, размахивать молотком по молодым умам требующим объяснения, с пеной у рта доказывать что "Я прекрасен - А ВЫ ОЛЕНИ все"
0
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
11.10.2021, 16:36 14
Цитата Сообщение от Yaroslav_Fil Посмотреть сообщение
, ради того чтобы понять где и в чем я ошибаюсь.
Но по итогу тебе не объясняют конкретно что так делать не надо, а насовывают портянки того, как твоя идея может работать

Что, тролли подъехали ?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
11.10.2021, 16:47 15
Цитата Сообщение от OpXiv Посмотреть сообщение
по итогу тебе не объясняют конкретно что так делать не надо, а насовывают портянки того, как твоя идея может работать
Ты тему невнимательно читал:
Цитата Сообщение от Para bellum Посмотреть сообщение
решение это так себе... Работает оно вопреки здравому смыслу.
0
68 / 60 / 18
Регистрация: 03.12.2010
Сообщений: 365
11.10.2021, 16:47 16
Цитата Сообщение от Yaroslav_Fil Посмотреть сообщение
Именно поэтому чтобы развиваться я пришел на форум и задаю вопросы, ради того чтобы понять где и в чем я ошибаюсь.
Умение различать, где тебе подсказывают не верно и где подсказывают верно, но ты сам ещё этого не понял. Вот главный признак обучаемости.
На самом деле ваша задача очень простая. Вы спрашивали про switch и case, и вам сразу сказали о том, что можно переделать в if
По большей части это одно и тоже. Различие в том, что вам не нужно писать каждый раз сравнение.
Матчасть про Switch-Case
Посмотрите первый пример и всё станет понятно.

Можно переписать все ваши кейсы на if-ы и там уже дебажить с мыслью "почему не заходит в этот if?"
0
11.10.2021, 16:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.10.2021, 16:47
Помогаю со студенческими работами здесь

Как воспроизвести файл в формате flv на своём сайте по условию switch - case?
Здравствуйте, я ещё новичок в web-программировании, но себе уже практически написал сайт. На нём...

Поместить switch в switch
Всем привет. Есть работающий код который обрабатывает строку GET и берет от туда данные Вот урл...

Switch в switch-е
Вопрос , не будет ли ошибкой вот такая схема допустим: &lt;? switch(a){ case 1: ....;...

Из If/else в switch/case
Необходимо добавить 3й вариант/язык (de) в этот код: if ($user_lang_settings) { ...

Header и switch
помогите пожалуста не работает перенаправление (((( $type=mysql_query(&quot;SELECT type FROM users...

Не работает switch
У меня не работает switch $cat = $_GET; switch($cat) { case ($cat&gt;=15 AND $cat&lt;=30 OR...

Foreach switch
Есть такая часть кода foreach (explode(&quot;\r\n&quot;, $str) as $k) { $keys =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru