PHP количество вхождений символов строки в другую строку - PullRequest
6 голосов
/ 19 января 2011

Допустим, у меня есть две строки.

$needle = 'AGUXYZ';
$haystack = 'Agriculture ID XYZ-A';

Я хочу посчитать, как часто символы, которые в $needle встречаются в $haystack. В $haystack есть символы «A» (дважды), «X», «Y» и «Z», все из которых находятся в игле, поэтому результат должен быть 5 (чувствителен к регистру).

Есть ли какая-нибудь функция для этого в PHP или я должен программировать ее сам?

Заранее спасибо!

Ответы [ 9 ]

20 голосов
/ 19 января 2011

Вы можете рассчитать длину исходной строки и длину строки без этих символов. Разница между ними заключается в количестве совпадений.

В основном,

$needle = 'AGUXYZ';
$haystack = 'Agriculture ID XYZ-A';

Вот часть, которая делает работу. В одну строку.

$count = strlen($haystack) - strlen(str_replace(str_split($needle), '', $haystack));

Объяснение: Первая часть не требует пояснений. Вторая часть - это длина строки без символов в строке $needle. Это делается путем замены каждого вхождения любых символов внутри $needle пустой строкой.

Для этого мы разбиваем $needle на массив по одному символу для каждого элемента, используя str_split Затем передайте его str_replace. Он заменяет каждое вхождение любых элементов в массиве $search пустой строкой.

Эхо,

echo "Count = $count\n";

вы получите:

Количество = 5

6 голосов
/ 19 января 2011

Попробуйте;

function count_occurences($char_string, $haystack, $case_sensitive = true){
    if($case_sensitive === false){
        $char_string = strtolower($char_string);
        $haystack = strtolower($haystack);
    }

    $characters = str_split($char_string);
    $character_count = 0;
    foreach($characters as $character){
        $character_count = $character_count + substr_count($haystack, $character);
    }
    return $character_count;
}

Для использования;

$needle = 'AGUXYZ';
$haystack = 'Agriculture ID XYZ-A';
print count_occurences($needle, $haystack);

Вы можете установить третий параметр на false, чтобы игнорировать регистр.

4 голосов
/ 19 января 2011

Нет встроенной функции, которая обрабатывает наборы символов, но вы просто используете функцию substr_count в цикле следующим образом:

<?php
    $sourceCharacters = str_split('AGUXYZ');
    $targetString = 'Agriculture ID XYZ-A';
    $occurrenceCount = array();

    foreach($sourceCharacters as $currentCharacter) {
        $occurrenceCount[$currentCharacter] = substr_count($targetString, $currentCharacter);
    }

    print_r($occurrenceCount);
?>
3 голосов
/ 19 января 2011

Специального метода для этого не существует, но этот встроенный метод наверняка поможет вам:

$count = substr_count($haystack , $needle);

edit: Я только что сообщил об общем методе substr_count.в вашем конкретном случае вам нужно вызывать его для каждого символа внутри $ needle (спасибо @Alan Whitelaw)

1 голос
/ 19 января 2011

Если вас не интересует распределение символов, вы можете использовать регулярное выражение

echo preg_match_all("/[$needle]/", $haystack, $matches);

, которое возвращает количество полных совпадений с образцом (которое может быть нулевым), или FALSE, если произошла ошибка,Решение , предлагаемое @ thai выше, должно быть значительно быстрее.


Если распределение символов имеет какое-либо значение, вы можете использовать count_chars:

$needle = 'AGUXYZ';
$haystack = 'Agriculture ID XYZ-A';

$occurences = array_intersect_key(
    count_chars($haystack, 1),
    array_flip(
        array_map('ord', str_split($needle))
    )
);

Результатом будет массив с ключами, являющимися значениями ASCII символа.
Затем вы можете перебрать его с помощью

foreach($occurences as $char => $amount) {
    printf("There is %d occurences of %s\n", $amount, chr($char));
}

Вы все равно можете передать *От 1020 * массив до array_sum для расчета суммы.

0 голосов
/ 20 января 2015

У меня есть рекурсивный метод, чтобы преодолеть это:

function countChar($str){

  if(strlen($str) == 0) return 0;

  if(substr($str,-1) == "x") return 1 + countChar(substr($str,0,-1));

  return 0 + countChar(substr($str,0,-1));

}

  echo countChar("xxSR"); // 2
  echo countChar("SR"); // 0
  echo countChar("xrxrpxxx"); // 5
0 голосов
/ 19 января 2011

я сделаю что-то вроде: разбить строку на символы (str_split), а затем использовать array_count_values, чтобы получить массив каждого символа, сколько раз встречается.

    $needle = 'AGUXYZ';
        $string = "asdasdadas asdadas asd asdsd";
        $array_chars = str_split($string);
        $value_count = array_count_values($array_chars);
        for($i=0;$i<count($needle);$i++)
           echo $needle[$i]. " is occur " . 
          ($value_count[$needle[$i]] ? $value_count[$needle[$i]] : '0')." times";
0 голосов
/ 19 января 2011

Существует функция PHP substr_count для подсчета количества экземпляров символа в строке.Было бы тривиально расширить его для нескольких символов:

function substr_multi_count ($haystack, $needle, $offset = 0, $length = null) {
    $ret = 0;

    if ($length === null) {
        $length = strlen($haystack) - $offset;
    }

    for ($i = strlen($needle); $i--; ) {
        $ret += substr_count($haystack, $needle, $offset, $length);
    }

    return $ret;
}
0 голосов
/ 19 января 2011

substr_count приблизит вас. Однако это не будут делать отдельные персонажи. Таким образом, вы можете перебрать каждый символ в $needle и вызывать эту функцию при суммировании счетчиков.

...