Получить количество вхождений подстроки в массив - PullRequest
2 голосов
/ 03 октября 2011

Я бы хотел узнать, сколько раз подстрока встречается в массиве. Это для сайта Drupal, поэтому мне нужно использовать код PHP

$ar_holding = array('usa-ny-nyc','usa-fl-ftl', 'usa-nj-hb', 
                    'usa-ny-wch', 'usa-ny-li');

Мне нужно иметь возможность вызывать такую ​​функцию, как foo($ar_holding, 'usa-ny-');, чтобы она возвращала 3 из массива $ar_holding Я знаю о функции in_array(), но она возвращает индекс первого вхождения строки. Мне нужна функция для поиска подстрок и возврата счетчика.

Ответы [ 4 ]

4 голосов
/ 03 октября 2011

Вы можете использовать preg_grep():

$count = count( preg_grep( "/^usa-ny-/", $ar_holding ) );

Это будет подсчитывать количество значений, которые начинаются с "usa-ny-".Если вы хотите включить значения, содержащие строку, в любую позицию, удалите символ вставки (^).

Если вы хотите использовать функцию, которая может использоваться для поиска произвольных строк, вам также следует использовать preg_quote():

function foo ( $array, $string ) {
    $string = preg_quote( $string, "/" );
    return count( preg_grep( "/^$string/", $array ) );
}
3 голосов
/ 03 октября 2011

Если вам нужен поиск с начала строки, работает следующее:

$ar_holding = array('usa-ny-nyc','usa-fl-ftl', 'usa-nj-hb', 
                    'usa-ny-wch', 'usa-ny-li');

$str = '|'.implode('|', $ar_holding);

echo substr_count($str, '|usa-ny-');

Используется функция implode для объединения всех значений массива с символом | между(и перед первым элементом), поэтому вы можете искать этот префикс с помощью вашего поискового запроса.substr_count делает грязную работу.

| действует как управляющий символ, поэтому он не может быть частью значений в массиве (что не так), просто говоря, что если вашизменения данных.

1 голос
/ 03 октября 2011
$count = subtr_count(implode("\x00",$ar_holding),"usa-ny-");

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

0 голосов
/ 01 апреля 2018

Я не вижу причин для чрезмерного усложнения этой задачи.

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

Код: (Демо: https://3v4l.org/5Lq3Y)

function foo($ar_holding, $starts_with) {
    $count = 0;
    foreach  ($ar_holding as $v) {
        if (strpos($v, $starts_with)===0) {
            ++$count;
        }
    }
    return $count;
}

$ar_holding = array('usa-ny-nyc','usa-fl-ftl', 'usa-nj-hb', 
                    'usa-ny-wch', 'usa-ny-li');
echo foo($ar_holding, "usa-ny-");  // 3

Или, если вы не хотите объявлять какие-либо временные переменные:

function foo($ar_holding, $starts_with) {
    return sizeof(
        array_filter($ar_holding, function($v)use($starts_with){
             return strpos($v, $starts_with)===0;
        })
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...