在PHP中计算数组中元音字母的数量

3
在PHP中,我编写了一个脚本来计算数组中元音字母的数量并输出结果。
运行脚本时,我收到了一个“未定义的偏移量”错误。
这段代码有什么问题?
for($a = 0; $a < count($expld); $a++) {
    for($b = 0; $b < strlen($expld[$b]); $b++) {
        if ($expld[$b] == 'A' || $expld[$b] == 'a' || $expld[$b] == 'E' || $expld[$b] == 'e'
            || $expld[$b] == 'I' || $expld[$b] == 'i' || $expld[$b] == 'O' || $expld[$b] == 'o'
            || $expld[$b] == 'U' || $expld[$b] == 'u')
        {
            $vowel++;
        }
    }
    echo "$expld[$a] has $vowel vowels(s).<br> ";
}

你有什么问题? - mcserep
当我输入时,它显示一个错误。Shulz在这里留下了痕迹。 C:\wamp\www\Maglana_SW02template.php的第24行出现未定义的偏移量:3。 - Shulz
1
这可能是因为您正在使用 $b 索引 $expld,而不是 $a。此外,在检查字符时,索引是错误的。 - mcserep
是的,我尝试使用strlen($expld[$a]),但似乎会加剧错误。 - Shulz
@Shulz,发布了答案,缩短形式。 - Madan Sapkota
显示剩余2条评论
4个回答

2

作为另一个可能的解决方案。您可以使用正则表达式:

$stringToTest = implode($expld);
$vowelsCount = strlen(preg_replace('/[^aeiouAEIOU]/', '', $stringToTest));

在这里,我们从字符串中删除除元音字母以外的所有内容,然后计算剩余字符的数量(应该只有元音字母)。


哇,我认为那是我见过的最短的代码。 - Shulz

2

您可以检查字符是否存在于元音数组中。这样,您就不必进行冗长的检查!以下是执行此操作的代码...

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

for ($a = 0; $a < count($expld); $a++) {
    // init count
    $vowel_count = 0;

    for ($b = 0; $b < strlen($expld[$b]); $b++) {
        if (in_array(strtolower($expld[$a][$b]), $vowels)) {
            $vowel_count++;
        }
    }
    echo "$expld[$a] has $vowel_count vowels(s).";
}

希望这对你有所帮助。谢谢!

1

看起来你的索引混乱了,检查一下:

for($a = 0; $a < count($expld); $a++)
{
    $vowel = 0;
    for($b = 0; $b < strlen($expld[$a]); $b++)
    {
        if($expld[$a][$b] == 'A' || $expld[$a][$b] == 'a' || $expld[$a][$b] == 'E' || $expld[$a][$b] == 'e'
        || $expld[$a][$b] == 'I' || $expld[$a][$b] == 'i' || $expld[$a][$b] == 'O' || $expld[$a][$b] == 'o'
        || $expld[$a][$b] == 'U' || $expld[$a][$b] == 'u')
        {
          $vowel++;
        }
    }
    echo "$expld[$a] has $vowel vowels(s).<br> ";
}

哦我的!我从没想过这会是一个二维数组! - Shulz
好的,它本质上并不是数组,但你可以将一个字符串虚拟表示为字符数组 :) - mcserep

1

首先,有几点观察:

  • 您似乎没有正确使用$a和$b索引;您的第二个for循环忽略了它在$a中的位置!由于您正在遍历数组中的每个字符串,因此更安全的选择可能是使用foreach循环(少一件要跟踪的事情)
  • 您没有定义您的元音计数,因此它不会显示0。此外,由于您没有重置您的元音计数,计数将继续增加

这里是一个使用foreach循环的示例(在PHP 5.4+中测试):

$input = "Charles Schultz was here";

// Instead of adding a large if-elseif-elseif-... statement, define
//   the vowels in an array, then check if the value is in that array
$vowels = array('a','e','i','o','u','A','E','I','O','U');
$exploded = explode(" ", $input);

foreach($exploded as $string) {
    // Reset the counter for each word
    $count_vowels = 0;
    for($i = 0; $i < strlen($string); $i++) {
        if(in_array($string[$i], $vowels)) {
            $count_vowels++;
        }
    }
    echo "$string has $count_vowels vowel(s).<br />";
}

那个foreach循环我还不太熟悉,但它与for循环有些相似。我仍在努力学习PHP。为了更高效,我可以在这里使用toLower()吗? - Shulz
@Shulz - 这很类似于for循环,但要记住的是(特别是对于初学PHP的人),要保持你的代码易读。foreach循环容易阅读(对于数组中的每个元素和每个元素表示为$string...),它可以简化你的代码。至于使用strtolower,这样做不会有坏处,但在这种小规模的情况下,实际上并不重要。您需要在爆炸之前在$input上调用它,然后只需删除$vowels数组中的大写元音字母即可。 - Chris Forrence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接