2011-09-19 27 views
5

Nếu tôi xác định một biến chuỗi đơn giản, làm cách nào để tính và xuất số nguyên âm trong chuỗi theo cách đơn giản nhất có thể?Cách đơn giản để đếm các nguyên âm trong một chuỗi trong PHP?

Tôi đã tìm kiếm và tìm thấy một số cách tương tự để làm như vậy, nhưng hầu hết dường như phức tạp hơn mức cần thiết. Tất cả chúng đều có chức năng và có lẽ sự phức tạp là cần thiết, nhưng tôi đang tìm giải pháp đơn giản nhất có thể.

biến chuỗi của tôi sẽ là một cái gì đó như:

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

Tôi chỉ muốn hiển thị tổng số các trường hợp a, e, i, o, u. Cảm ơn bạn trước.

+0

Mặc dù vấn đề này có thể không thực sự ảnh hưởng đến hiệu suất, nhưng bạn nên tìm sự phức tạp tối thiểu trước và sau đó cố gắng đơn giản càng tốt. Trên thực tế bạn nên luôn luôn, khi có thể, suy nghĩ thay vì làm cho bộ vi xử lý suy nghĩ. –

Trả lời

8

Dưới đây là một giải pháp dễ dàng:

<?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

chưa được kiểm tra nhưng nên làm việc:

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

Tôi nghĩ rằng mô hình phải nằm trong một chuỗi. – icktoofay

+0

@icktoofay bạn là đúng – 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"; 

Something như thế này nên làm việc. Tôi không thể nghĩ ra một phương pháp đơn giản hơn.

8

Tại sao không chỉ

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

Tôi sẽ, tuy nhiên, bọc nó trong một hàm nếu không bạn sẽ phải thay đổi tên của các biến mỗi khi bạn muốn sử dụng lại nó:

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

Lưu ý: điều này có thể chậm hơn so với thực sự lặp qua (mặc dù, bởi vì nó là một hàm được xác định trước, nó có thể nhanh hơn) –

+0

Thực sự thông minh! nhưng có hiệu suất cao hơn nhiều so với nó xứng đáng. –

0

Không thích hợp cho các chuỗi trong bộ ký tự nhiều byte.

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

Tôi nghĩ bạn muốn làm điều đó 'tiếp tục 2'. – alex

+0

@alex: Ồ không! nó không nên tiếp tục, mà đúng hơn là 'ngắt' để kết thúc toàn bộ vòng lặp' for' thứ hai cùng một lúc. –

+0

'break' và' continue 2' nên làm điều tương tự, tôi nghĩ vậy. – alex

1

Đây là một cách khác để làm điều đó ...

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

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

CodePad.

Nhưng, tính năng này cũng hoạt động, chỉ cần đảm bảo bạn không hoạt động trên chuỗi gốc vì nó sẽ thay đổi.

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

CodePad.

1

Tôi biết khá muộn, nhưng tôi đã thử nghiệm tất cả các câu trả lời ở trên và hiệu suất không tốt khi xử lý chuỗi lớn.

Tôi tin rằng mã này là tốt hơn về bộ nhớ và thời gian thực hiệ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

Đếm nguyên âm trong chuỗi sử dụng hàm trong php.

echo substr_count("£string","a")+substr_count("£string","e")+substr_count("£string","i")+substr_count("£string","o")+substr_count("£string","u"); 
Các vấn đề liên quan