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

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

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

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

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

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

Ответы на вопрос(9)

Есть функция PHPsubstr_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;
}

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 игнорировать дело.

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

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

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));
}

Вы могли бы еще передать$occurences массив дляarray_sum рассчитать итог.

 Gordon19 янв. 2011 г., 15:25
@ircmaxell извините насчет этого :) и спасибо
 ircmaxell19 янв. 2011 г., 15:50
ты знаешь, что они говорят,Великие умы думают одинаково, но дураки редко отличаются...
 ircmaxell19 янв. 2011 г., 15:24
Ну, это эквивалент того, что я только что опубликовал, так что +1 вам, сэр ...
Решение Вопроса

волов. Разница между ними заключается в количестве совпадений.

В основном,

$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

 acm19 янв. 2011 г., 15:44
+1, хорошее нестандартное мышление!

которая обрабатывает наборы символов, но вы просто используете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);
?>

но этот встроенный метод наверняка поможет вам:

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

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

 Alan Whitelaw19 янв. 2011 г., 15:05
Это будет выглядеть только дляAGUXYZ в стоге сена, как показывает php.net/substr-count$needle быть строкой
 stecb19 янв. 2011 г., 15:09
Это общий пример substr_count ... для достижения этого конкретного результата вам необходимо проверить каждый символ строки $ needle :) .. извините, я не объяснил это;)

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

разделить строку на символы (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";

Ваш ответ на вопрос