count_chars

(PHP 4, PHP 5, PHP 7, PHP 8)

count_chars文字列で使用されている文字に関する情報を返す

説明

count_chars(string $string, int $mode = 0): array|string

string において各バイト値 (0..255) が存在する数をかぞえ、様々な手法で返します。

パラメータ

string

調べたい文字列。

mode

戻り値を参照ください。

戻り値

mode の値により、 count_chars() は以下の値のどれかを返します。

  • 0 - 各バイト値をキー、各バイトの出現回数を値とする配列。
  • 1 - 0と同じですが、各バイト値の出現回数がゼロより大きいものの一覧となります。
  • 2 - 0と同じですが、各バイト値の出現回数がゼロであるものの一覧となります。
  • 3 - すべての一意な文字を含む文字列を返します。
  • 4 - 使用されていない全ての文字を含む文字列を返します。

変更履歴

バージョン 説明
8.0.0 これより前のバージョンでは、この関数は失敗時に false を返していました。

例1 count_chars() の例

<?php
$data
= "Two Ts and one F.";

foreach (
count_chars($data, 1) as $i => $val) {
echo
"There were $val instance(s) of \"" , chr($i) , "\" in the string.\n";
}
?>

上の例の出力は以下となります。

There were 4 instance(s) of " " in the string.
There were 1 instance(s) of "." in the string.
There were 1 instance(s) of "F" in the string.
There were 2 instance(s) of "T" in the string.
There were 1 instance(s) of "a" in the string.
There were 1 instance(s) of "d" in the string.
There were 1 instance(s) of "e" in the string.
There were 2 instance(s) of "n" in the string.
There were 2 instance(s) of "o" in the string.
There were 1 instance(s) of "s" in the string.
There were 1 instance(s) of "w" in the string.

参考

  • strpos() - 文字列内の部分文字列が最初に現れる場所を見つける
  • substr_count() - 副文字列の出現回数を数える

add a note add a note

User Contributed Notes 11 notes

up
24
marcus33cz
12 years ago
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 )
?>
up
2
Eric Pecoraro
19 years ago
<?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';
    }
}

?>
up
1
seb at synchrocide dot net
20 years ago
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
up
0
Andrey G
4 years ago
Checking that two strings are anagram:

<?php

function isAnagram($string1, $string2)
{
  return
count_chars($string1, 1) === count_chars($string2, 1);
}

isAnagram('act', 'cat'); // true

?>
up
0
Anonymous
8 years ago
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;
   
}
?>
up
-1
pzb at novell dot com
17 years ago
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;
}
?>
up
-3
phpC2007
16 years ago
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;
}
?>
up
-6
qeremy [atta] gmail [dotta] com
11 years ago
Another approach to counting unicode chars.

<?php
function count_chars_unicode($str, $x = false) {
   
$tmp = preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY);
    foreach (
$tmp as $c) {
       
$chr[$c] = isset($chr[$c]) ? $chr[$c] + 1 : 1;
    }
    return
is_bool($x)
        ? (
$x ? $chr : count($chr))
        :
$chr[$x];
}

$str = "şeker şeker yâriiiiiiiiiimmmmm";
print_r(count_chars_unicode($str, 'â'));    // frequency of "â"
print_r(count_chars_unicode($str));         // count of uniq chars
print_r(count_chars_unicode($str, true));   // all chars with own frequency
?>

Outputs;
1
9
Array
(
    [ş] => 2
    [e] => 4
    [k] => 2
    [r] => 3
    [ ] => 2
    [y] => 1
    [â] => 1
    [i] => 10
    [m] => 5
)
up
-5
mlong at mlong dot org
22 years ago
// 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")];
?>
up
-7
maotin at hongkong dot com
23 years ago
Here are some more experiments on this relatively new and extremely handy function.

<?php
$string
= 'I have never seen ANYTHING like that before! My number is "4670-9394".';

foreach(
count_chars($string, 1) as $chr => $hit)
echo
'The character '.chr(34).chr($chr).chr(34).' has appeared in this string '.$hit.' times.<BR>';

#The result looks like
#The character " " has appeared in this string 11 times.

echo count_chars($string,3);
#The output is '!"-.034679AGHIMNTYabefhiklmnorstuvy'

echo strlen($string).' is not the same as '.strlen(count_chars($string, 3));

#This shows that '70 is not the same as 36'
?>

As we can see above:

1)If you cares only about what is in the string, use count_chars($string, 1) and it will return an (associative?) array of what shows up only.

2) Either I misunderstood what the manul actually said, or it does not work the way it described: count_chars($strting, 3) actually returned a string of what characters are in the string, not a string of their byte-values (which is great because a string of numbers would be much harder to handle);

3)This is a short version of password checking: get the original string's length, then compare with the length of the string returned by count_chars($string,3). 

<?php
$length_of_string
= strlen($string);
$num_of_chars = strlen(count_chars($string, 3));

$diff = ($length_of_string - $num_of_chars);

if (
$diff)
echo
'At least one character has been used more than once.';
else
echo
'All character have been used only once.';
?>

Note that since $num_of_chars gives no information about the actual number of occurance, we cannot go any further by the same rationale and say when $diff =2 then 2 characters showed up twice; it might be 1 character showd up 3 times, we have no way to tell (a good tolerance level setter, though).  You have to get the array and check the values if you want to have more control.

4) Final trick: now we have a primitive way to count the number of words in a string! (or do we have a fuction for that already?)
up
-12
apinpratap at gmail dot com
17 years ago
this code can find each characters count

<?php
$enter
= 0;
$data = strtolower ($inputString);
foreach (
count_chars ($data, 1) as $i => $val)
    {
        if (
$enter == 1)
        {
           
$enter = 0;
            continue;
        }
        if (
chr ($i) == "\n")
        {
            echo
"There are $val instance(s) of \" Enter \" in the string.\n";
           
$enter = 1;
        }
        else
        {
            echo
"There are $val instance(s) of \"" , chr ($i) , "\" in the string.\n";
        }
    }
?>
To Top