Суммирование данных preg_match_all

181
05 октября 2017, 14:13

Всем привет! Жутко подтупливаю, есть функция поиска слов в тексте, произвожу поиск по циклу, после если слова нашлись, мне нужно получить сумму всех найденных слов, но что-то я не могу понять как это сделать. Код снизу, вопрос как суммировать $result найденных данных?

$url = "В разделе отдельные промышленные металлодекторы интернет-магазина  представлено оборудование от ведущих мировых производителей.";
$filt = array ('промышленные','мировых,оборудование');
function txtsearch($url, $filt) { 
foreach ($filt as $filter)
    { preg_match_all("/(?<![\w\d])$filter(?![\w\d])/siu", mb_strtolower($url), $result);
        echo $result;
    }
    }
Answer 1

Как я понимаю, надо всего лишь воспользоваться array_count_values для подсчёта.

Ну и сделать косметическую правку в виде implode('|', $filterArr).

Пример:

$text = <<<TEXT
В разделе отдельные промышленные промышленные промышленные 
металлодекторы интернет-магазина  
представлено оборудование от ведущих мировых производителей. супер пупер мировых производителей!
TEXT;
$filterArr = array('промышленные','мировых','оборудование');
preg_match_all("/(?<![\w\d])".implode('|', $filterArr)."(?![\w\d])/siu", mb_strtolower($text), $searchResult);
$filterCountValues = array_count_values($searchResult[0]);
foreach ($filterCountValues as $word => $count) {
    echo 'слово "' . $word . '" встретилось ' . $count . ' раз(а) <br/>';
}

В $searchResult[0] будет массив:

    Array (
        [0] => промышленные
        [1] => промышленные
        [2] => промышленные
        [3] => оборудование
        [4] => мировых
        [5] => мировых
    )

Вывод:

слово "промышленные" встретилось 3 раз(а) 
слово "оборудование" встретилось 1 раз(а) 
слово "мировых" встретилось 2 раз(а) 

P.S. Возможно нужен вывод количества раз всех слов, даже если они не встречались, тогда цикл такой:

foreach ($filterArr as $word) {
    $tpl = 'слово "' . $word . '" встретилось ';    
    $tpl .= isset($filterCountValues[$word]) ? $filterCountValues[$word] : 0;    
    $tpl .= ' раз(а) <br/>';
    echo $tpl;
}
Answer 2
function txtsearch($url, $filt) { 
 $count_txtsearch = 0;
foreach ($filt as $filter)
    {
        preg_match("/(?<![\w\d])$filter(?![\w\d])/siu", mb_strtolower($url), $result);
        $count_txt = count($result);            
        $count_txtsearch+=$count_txt;           
    }
        if ( $count_txtsearch > 0) {
        return 1;
        } else {
        return 0;    
        }
    }
READ ALSO
Не выводятся все поля из модели в Yii2

Не выводятся все поля из модели в Yii2

Например во вьюхе вывожу пользователей так:

184
Парсинг CSV на php, странная проблема

Парсинг CSV на php, странная проблема

Здравствуйте, есть файл csv, практически все строки парсятся нормально, разделителем выступает |, но есть некоторые строки, которые некорректно...

221
Ошибка при работе с swiftmailer

Ошибка при работе с swiftmailer

Цель: переслать сообщение при помощи swiftmailerВот код

276
Как подключить вложенный контроллер в Laravel v5?

Как подключить вложенный контроллер в Laravel v5?

Здравствуйте, я начал изучать Laravel, не могу никак понять, как мне распределить контроллеры header, footer и подключать их на каждой странице, как...

214