2011-09-19 20 views
5

Si defino una variable de cadena simple, ¿cómo contaría y daría salida al número de vocales en la cadena de la manera más simple posible?¿Forma simple de contar las vocales en una cadena en PHP?

He buscado y encontrado una serie de formas similares de hacerlo, pero la mayoría parece más compleja de lo necesario. Todos son funcionales y tal vez la complejidad ES necesaria, pero estoy buscando la solución más simple posible.

Mi variable de cadena sería algo así como:

$someString = "This is some text with some more text and even more text." 

sólo quiero mostrar los casos totales de a, e, i, o, u. Gracias de antemano.

+0

Aunque este problema puede no afectar realmente el rendimiento, primero debe buscar la menor complejidad y luego intentar simplificarlo lo más posible. En realidad, siempre que sea posible, siempre debe pensar en lugar de hacer pensar al procesador. –

Respuesta

8

Aquí es una solución fácil:

<?php 
$string = "This is some text with some more text and even more text."; 
echo "There are <strong>".preg_match_all('/[aeiou]/i',$string,$matches)." vowels</strong> in the string <strong>".$string."</strong>"; 
?> 
3

no probado pero debería funcionar:

$matches = preg_match_all('/[aeiou]/i', $someString, $ignore); 
+2

Creo que el patrón tiene que estar en una cadena. – icktoofay

+0

@icktoofay está en lo correcto – evan

0
$someString = "This is some text with some more text and even more text."; 
echo preg_match_all('/[aouie]/i', $someString, $out); 
1
preg_match('#[aeiou]#i', $someString, $matches); 
echo count($matches) - 1, "\n"; 

Algo como esto se debe trabajar. No puedo pensar en un método más simple.

8

¿Por qué no

$Vowels = substr_count($someString, 'a')+substr_count($someString, 'e')+substr_count($someString, 'i')+substr_count($someString, 'o')+substr_count($someString, 'u'); 

Quisiera, sin embargo, encerrar en una función de lo contrario tendría que cambiar los nombres de las variables cada vez que quiera volver a utilizarlo:

function CountVowels($String) { 
    return substr_count($String, 'a')+substr_count($String, 'e')+substr_count($String, 'i')+substr_count($String, 'o')+substr_count($String, 'u'); 
} 

echo CountVowels('This is some text with some more text and even more text.'); 
//Echos 17 
+0

Nota: esto podría ser más lento que en realidad iterar (aunque es una función predefinida, podría ser más rápido) –

+0

¡Muy inteligente! pero toma mucho más rendimiento de lo que merece. –

0

No es adecuado para cadenas en juegos de caracteres multibyte.

function countSpecificChars ($string, $charsOfInterest) { 
    $count = 0; 
    $len = strlen($string); 
    for ($i = 0; $i < $len; $i++) { 
     if (in_array($string[$i], $charsOfInterest)) { 
      $count++; 
     } 
    } 
    return $count; 
} 

function countVowels ($string) { 
    return countSpecificChars($string, array('a', 'e', 'i', 'o', 'u')); 
} 

echo countVowels('This is some text with some more text and even more text.'); 
// echoes '17' 
0
$someString = "This is some text with some more text and even more text."; 

$total = 0; 
$vowels = Array('a','e','i','o','u'); 

for ($i=0;$i<strlen($someString);$i++) 
{ 
    for ($j = 0;$j<5;$j++) 
     if ($someString[$i] == $vowels[$j]) 
     { 
      $total++; 
      break; 
     } 
} 
echo $total; 
+0

Creo que le gustaría hacer que 'continue 2'. – alex

+0

@alex: ¡Oh, no! no debería continuar en absoluto, sino 'romper' para finalizar todo el segundo bucle' for' a la vez. –

+0

'break' y' continue 2' deberían hacer lo mismo, creo. – alex

1

Aquí hay otra manera de hacerlo ...

$vowels = array('a', 'e', 'i', 'o', 'u'); 

$vowelsCounts = array_sum(
       array_intersect_key(
        array_count_values(
        str_split(
        strtolower($str) 
        ) 
       ), 
        array_flip($vowels) 
       ) 
       ); 

CodePad.

Pero, esto también funciona, solo asegúrate de no operar esto en la cadena original, ya que la cambiará.

str_replace($vowels, FALSE, $str, $vowelsCounts); 

CodePad.

1

Sé que es bastante tarde, pero he probado todas las respuestas anteriores y el rendimiento no era bueno cuando manejaba una cuerda grande.

Creo que este código es mejor sobre la memoria y el tiempo de ejecución

$counter = 0; 
$a = array("a","e","i","o","u"); 
foreach (count_chars($str, 1) as $k => $v) { 
    //echo "There were $v instance(s) of \"" .$k."/". chr($k) . "\" in the string.\n"; 
    if(in_array(strtolower(chr($k)), $a)) 
     $counter += $v; 
} 
0

conde la vocal en la cadena utilizando la función en php.

echo substr_count("£string","a")+substr_count("£string","e")+substr_count("£string","i")+substr_count("£string","o")+substr_count("£string","u"); 
Cuestiones relacionadas