За последние 24 часа нас посетили 20067 программистов и 1003 робота. Сейчас ищет 351 программист ...

Какой код сработает быстрее или есть ли альтернативный варинт?

Тема в разделе "PHP для новичков", создана пользователем Dyec, 1 июн 2020.

  1. Dyec

    Dyec Активный пользователь

    С нами с:
    14 мар 2013
    Сообщения:
    8
    Симпатии:
    0
    Всем привет! У бота в вк есть проверка на команды, например массив с поступившей командой 'как дела?' или 'как делишки?', так вот. В первом варианте если написать 'тестим'. прилетают 2 сообщения сразу, а во втором варианте работает как часы, но.... По сути это говнокод, может у меня слов 10 будет на проверке, и каждый раз писать false !== mb_stripos($cmd, 'слово') - не вариант как-то. Пробывал массив внутри функции mb_stripos(), но не работает, работает только если вписать if(in_array($cmd, ['онлайн', 'online'])) , но работает только строго по команде. А надо чтобы искало из строки, например текст будет таким: "Всем привет это тест" - искомое слово ТЕСТ в строке.
    Ниже оба варианта работают, но как писал уже выше, в первом варианте слово 'тестим' посчитает дважды и скрипт отправит дважды сообщение. Вопрос: если альтернативные варианты или какой лучше оставить способ? Заранее благодарю.
    Вариант 1:
    PHP:
    1. $test = ['тест', 'тестим'];
    2.       foreach($test as $key){
    3.     if(false !== mb_stripos($cmd, $key)){
    4.        
    5.            $vk->sendMessage($peer_id, "тест лс беседы");
    6.  
    7.      }
    8.     }
    Вариант 2:
    PHP:
    1. if(false !== mb_stripos($cmd, 'тест') || false !== mb_stripos($cmd, 'тестим')){
    2.        
    3.            $vk->sendMessage($peer_id, "тест лс беседы");
    4.  
    5.        }
    6.      }
     
    #1 Dyec, 1 июн 2020
    Последнее редактирование: 1 июн 2020
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    В первом варианте, после выдачи сообщения боту ставь break и он дальше не будет ничего обрабатывать....
     
  3. Dyec

    Dyec Активный пользователь

    С нами с:
    14 мар 2013
    Сообщения:
    8
    Симпатии:
    0
    спасибо помогло.
    На другом форуме мне предложили такой ещё вариант, хз какой выбрать, чтобы быстро обрабатывал.
    PHP:
    1. $test = ['тест', 'тестим'];
    2. foreach($test as $key) {
    3.     if(1 === preg_match('/' . $key . '/u', $cmd)) {
    4.         $vk->sendMessage($peer_id, "тест лс беседы");
    5.     }
    6. }
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    ну от цикла не избавились, а регулярка имхо не всегда гуд....
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    mb_stripos() быстрее чем регулярка, если надо только проверить наличие.
    @Dyec ты сам понимаешь, почему два сообщения приходит? Если в строке если слово "тестим", то в ней так же есть слово "тест", потому что это часть слова "тестим". Если уже проверяешь на "тест" то нет смысла проверять на "тестим", Либо добавь пробелы до и после слова, чтобы проверять наличие целого слова "тест" и "тестим". Так же нужно будет добавить пробелы в начало и конец сообщения от пользователя, чтобы эта проверка работала если искомое слово находится в начале или в конце сообщения.
     
  6. Dyec

    Dyec Активный пользователь

    С нами с:
    14 мар 2013
    Сообщения:
    8
    Симпатии:
    0
    избавился теперь. На другом форуме подсказали, работает, то что мне нужно было! С регулярками слабоват я, если честно.
    А вот и сам код:
    PHP:
    1. $test = ['тест', 'тестим'];
    2. $pattern= implode('|', $test);
    3. if (preg_match('/'.$pattern.'/u', $cmd)) {
    4.     $vk->sendMessage($peer_id, "тест лс беседы");
    5. }
    про пробелы в курсе, просто бот должен в тексте реагировать на слова к примеру "привет как дела", на слово КАК ДЕЛА - он реагирует, если присутствует в тексте, или например ЧТО ДЕЛАЕШЬ, а к этим фразам синонимов много, шутки 3-5, а к другим и того больше, а значит массив нужен, что собственно и получилось.
    --- Добавлено ---
    спасибо, уже сделал. Выше написал решение. Про двойное сообщение я понял сразу и пробелы я тоже в курсе, ниже код, проще говоря бот реагирует пользователям если они даже не к нему обращались и не писали ему команду, проще говоря он вмешивается в диалог)) Вот кусок примера допустим реакции:
    PHP:
    1.        $robot = [' бот', ' бот ', 'бот ', 'робот'];
    2.        $pattern4 = implode('|', $robot);
    3.         if($cmd == 'бот' || preg_match('/'.$pattern4.'/u', $cmd)) {
    4.          //создаём базу ответов
    5.        $attached = array('реакция 1', 'реакция 2');
    6.        $chbad = mt_rand (0, count($attached)-1);
    7.               $vk->sendMessage($peer_id, $attached[$chbad]);
    8.     }
    а там реакций много подобных.
     
    #6 Dyec, 1 июн 2020
    Последнее редактирование: 1 июн 2020
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    @Dyec нет необходимости накидывать все варианты с пробелами.
    Достаточно одного варианта
    PHP:
    1. ' бот '
    с пробелами с обоих сторон.
    Потом нужно добавить пробелы к команде, независимо от того, есть они там или нет
    PHP:
    1. $cmd = " $cmd ";
    после этого, слово "бот" будет найдено как отдельное слово в любом входящем сообщении, в котором оно есть.
    Если хочешь разную реакцию на "робот" и "бот", проверяй в цикле, начиная с самого длинного слова.
     
  8. Dyec

    Dyec Активный пользователь

    С нами с:
    14 мар 2013
    Сообщения:
    8
    Симпатии:
    0
    спасибо, уже сделал. Выше написал решение.
    Кому интересно вот пример реакции:
    PHP:
    1.  
    2.        $robot = [' бот', ' бот ', 'бот ', 'робот'];
    3.        $pattern4 = implode('|', $robot);
    4.         if($cmd == 'бот' || preg_match('/'.$pattern4.'/u', $cmd)) {
    5.          //создаём базу ответов
    6.        $attached = array('реакция 1', 'реакция 2');
    7.        $chbad = mt_rand (0, count($attached)-1);
    8.               $vk->sendMessage($peer_id, $attached[$chbad]);
    9.     }
    10.    }
    спасибо за совет, у меня там одна реакция на бот с рандомными ответами, а так у меня там другие реакции например на: как дела или что делаешь, и .т.д.