count_chars
(PHP 4, PHP 5)
count_chars — Возвращает информацию о символах, входящих в строку
Описание
Подсчитывает количество вхождений каждого из символов с ASII кодами в диапазоне (0..255) в строку string и возвращает эту информацию в различных формата. Необязательный аргумент mode по умолчанию равен 0. В зависимости от его значения возвращается:
- 0 - массив, индексами которого являются ASCII коды, а значениями - число вхождений соответствующего символа.
- 1 - то же, что и для 0, но информация о символах с нулевым числом вхождений не включается в массив.
- 2 - то же, что и для 0, но в массив включается информация только о символах с нулевым числом вхождений.
- 3 - строка, состоящая из символов, которые входят в исходую строку хотя бы раз.
- 4 - строка, состоящая из символов, которые не входят в исходую строку
Пример #1 Пример использования count_chars()
<?php
$data = "Две в и одна с";
$result = count_chars($data, 0);
for ($i=0; $i < count($result); $i++) {
if ($result[$i] != 0)
echo "\"" , chr($i) , "\" встречается в строке $result[$i] раз(а).\n";
}
?>
Этот код выведет :
" " встречается в строке 4 раз(а). "Д" встречается в строке 1 раз(а). "а" встречается в строке 1 раз(а). "в" встречается в строке 2 раз(а). "д" встречается в строке 1 раз(а). "е" встречается в строке 1 раз(а). "и" встречается в строке 1 раз(а). "н" встречается в строке 1 раз(а). "о" встречается в строке 1 раз(а). "с" встречается в строке 1 раз(а).
См. также описание функций strpos() и substr_count().
- addcslashes
- addslashes
- bin2hex
- chop
- chr
- chunk_split
- convert_cyr_string
- convert_uudecode
- convert_uuencode
- count_chars
- crc32
- crypt
- echo
- explode
- fprintf
- get_html_translation_table
- hebrev
- hebrevc
- hex2bin
- html_entity_decode
- htmlentities
- htmlspecialchars_decode
- htmlspecialchars
- implode
- join
- lcfirst
- levenshtein
- localeconv
- ltrim
- md5_file
- md5
- metaphone
- money_format
- nl_langinfo
- nl2br
- number_format
- ord
- parse_str
- printf
- quoted_printable_decode
- quoted_printable_encode
- quotemeta
- rtrim
- setlocale
- sha1_file
- sha1
- similar_text
- soundex
- sprintf
- sscanf
- str_getcsv
- str_ireplace
- str_pad
- str_repeat
- str_replace
- str_rot13
- str_shuffle
- str_split
- str_word_count
- strcasecmp
- strchr
- strcmp
- strcoll
- strcspn
- strip_tags
- stripcslashes
- stripos
- stripslashes
- stristr
- strlen
- strnatcasecmp
- strnatcmp
- strncasecmp
- strncmp
- strpbrk
- strpos
- strrchr
- strrev
- strripos
- strrpos
- strspn
- strstr
- strtok
- strtolower
- strtoupper
- strtr
- substr_compare
- substr_count
- substr_replace
- substr
- trim
- ucfirst
- ucwords
- vfprintf
- vprintf
- vsprintf
- wordwrap
Коментарии
// Usefulness of the two functions
<?php
$string="aaabbc";
// You just want to count the letter a
$acount=substr_count($string,"a");
// You want to count both letter a and letter b
$counts=count_chars($string,0);
$acount=$counts[ord("a")];
$bcount=$counts[ord("b")];
?>
After much trial and error trying to create a function that finds the number of unique characters in a string I same across count_chars() - my 20+ lines of useless code were wiped for this:
<?
function unichar($string) {
$two= strtolower(str_replace(' ', '', $string));
$res = count(count_chars($two, 1));
return $res;
}
/* examples :: */
echo unichar("bob"); // 2
echo unichar("Invisibility"); //8
echo unichar("The quick brown fox slyly jumped over the lazy dog"); //26
?>
I have no idea where this could be used, but it's quite fun
<?php
// Require (n) unique characters in a string
// Modification of a function below which ads some flexibility in how many unique characters are required in a given string.
$pass = '123456' ; // true
$pass = '111222' ; // false
req_unique($pass,3);
function req_unique($string,$unique=3) {
if ( count(count_chars($string,1)) < $unique) {
echo 'false';
}else{
echo 'true';
}
}
?>
This function is great for input validation. I frequently need to check that all characters in a string are 7-bit ASCII (and not null). This is the fastest function I have found yet:
<?php
function is7bit($string) {
// empty strings are 7-bit clean
if (!strlen($string)) {
return true;
}
// count_chars returns the characters in ascending octet order
$str = count_chars($str, 3);
// Check for null character
if (!ord($str[0])) {
return false;
}
// Check for 8-bit character
if (ord($str[strlen($str)-1]) & 128) {
return false;
}
return true;
}
?>
Here's a function to count number of strings in a string. It can be used as a simple utf8-enabled count_chars (but limited to a single mode)...
<?php
function utf8_count_strings($stringChar)
{
$num = -1;
$lenStringChar = strlen($stringChar);
for ($lastPosition = 0;
$lastPosition !== false;
$lastPosition = strpos($textSnippet, $stringChar, $lastPosition + $lenStringChar))
{
$num++;
}
return $num;
}
?>
If you have problems using count_chars with a multibyte string, you can change the page encoding. Alternatively, you can also use this mb_count_chars version of the function. Basically it is mode "1" of the original function.
<?php
/**
* Counts character occurences in a multibyte string
* @param string $input UTF-8 data
* @return array associative array of characters.
*/
function mb_count_chars($input) {
$l = mb_strlen($input, 'UTF-8');
$unique = array();
for($i = 0; $i < $l; $i++) {
$char = mb_substr($input, $i, 1, 'UTF-8');
if(!array_key_exists($char, $unique))
$unique[$char] = 0;
$unique[$char]++;
}
return $unique;
}
$input = "Let's try some Greek letters: αααααΕεΙιΜμΨψ, Russian: ЙЙЫЫЩН, Czech: ěščřžýáíé";
print_r( mb_count_chars($input) );
//returns: Array ( [L] => 1 [e] => 7 [t] => 4 ['] => 1 [s] => 5 [ ] => 9 [r] => 3 [y] => 1 [o] => 1 [m] => 1 [G] => 1 [k] => 1 [l] => 1 [:] => 3 [α] => 5 [Ε] => 1 [ε] => 1 [Ι] => 1 [ι] => 1 [Μ] => 1 [μ] => 1 [Ψ] => 1 [ψ] => 1 [,] => 2 [R] => 1 [u] => 1 [i] => 1 [a] => 1 [n] => 1 [Й] => 2 [Ы] => 2 [Щ] => 1 [Н] => 1 [C] => 1 [z] => 1 [c] => 1 [h] => 1 [ě] => 1 [š] => 1 [č] => 1 [ř] => 1 [ž] => 1 [ý] => 1 [á] => 1 [í] => 1 [é] => 1 )
?>
count_chars for multibyte supported.
<?php
function mb_count_chars ($string, $mode = 0) {
$result = array_fill(0, 256, 0);
for ($i = 0, $size = mb_strlen($string); $i < $size; $i++) {
$char = mb_substr($string, $i, 1);
if (strlen($char) > 1) {
continue;
}
$code = ord($char);
if ($code >= 0 && $code <= 255) {
$result[$code]++;
}
}
switch ($mode) {
case 1: // same as 0 but only byte-values with a frequency greater than zero are listed.
foreach ($result as $key => $value) {
if ($value == 0) {
unset($result[$key]);
}
}
break;
case 2: // same as 0 but only byte-values with a frequency equal to zero are listed.
foreach ($result as $key => $value) {
if ($value > 0) {
unset($result[$key]);
}
}
break;
case 3: // a string containing all unique characters is returned.
$buildString = '';
foreach ($result as $key => $value) {
if ($value > 0) {
$buildString .= chr($key);
}
}
return $buildString;
case 4: // a string containing all not used characters is returned.
$buildString = '';
foreach ($result as $key => $value) {
if ($value == 0) {
$buildString .= chr($key);
}
}
return $buildString;
}
// change key names...
foreach ($result as $key => $value) {
$result[chr($key)] = $value;
unset($result[$key]);
}
return $result;
}
?>
Checking that two strings are anagram:
<?php
function isAnagram($string1, $string2)
{
return count_chars($string1, 1) === count_chars($string2, 1);
}
isAnagram('act', 'cat'); // true
?>