没有输出?PHP foreach没有';似乎不起作用


No Output? PHP foreach doesn't seem to work

我正试图从给定的文本中形成一个首字母缩略词。这里的想法是,$text($text[0])中的第一个字母将使用array_push()获取并放置在数组$storage中。现在,如果数组中有空格,那么下一个索引的字母应该是Acronym的一部分。我目前没有得到输出,我缺少什么?

public function Acronym($text)
        {
            $text = str_split($text);
            $count = strlen($text);
            $storage = array();
            for($i=0; $i<$count; $i++)
            {
                array_push($storage, $text[0]);
                if($text[$i]==' ')
                {
                    array_push($storage, $text[$i+1]);
                }
                foreach($storage as $clean)
                {
                    echo $clean;
                }       
            }   
        }

您的算法存在一些致命缺陷:

  1. 您在数组上调用strlen(),而应该调用count():

    $text = str_split($text);
    $count = count($text);
    
  2. 但是,您可以将字符串作为数组进行索引,因此在这种情况下不需要str_split(),并且可以通过删除对str_split()的调用来保留$count = strlen( $text);

  3. 这应该只发生一次,所以它应该在循环之外(这意味着在1处启动$i):

    array_push($storage, $text[0]);
    
  4. 打印$storage数组的foreach循环应该在创建首字母缩略词的循环之外。

  5. 您可以使用简写的array_push()表示法来节省调用函数的开销。向数组中添加多个元素时,应使用array_push()。否则,这就足够了:

    $storage[] = $text[0];
    
  6. 你需要从你的功能中return一些东西,否则你将无法访问它之外的任何东西。

把这些放在一起,你就会得到这个:

public function Acronym($text)
{
    $count = strlen( $text);
    $storage[] = $text[0];
    for( $i = 1; $i < $count; $i++)
    {
        if( $text[$i] == ' ') 
        {
            $storage[] = $text[$i+1]);
            $i++; // Can increment $i here because we know the next character isn't a space
        }
    }
    foreach($storage as $clean)
    {
        echo $clean;
    }
    return $storage;
}

也就是说,有更好的实现来形成一个提供字符串输入的首字母缩写。这里有一个我能想到的:

public function Acronym( $text) 
{
    $acronym = array();
    foreach( explode( ' ', $text) as $word)
    {
        $word = trim( $word);
        $acronym[] = strtoupper( $word[0]);
    }
    return implode( '', $acronym);
}

请注意,对于像Hello World这样的输入,这两个函数都将失败。我将由OP进行这些修改(如有必要)。

str_split将字符串转换为数组。

str_length会带来已经用数组覆盖的字符串的长度。您需要count()

覆盖第一个变量$text

$count = strlen($text);

在这一行中,$text是一个数组,因为您在方法的第一行中更改了它。

尝试反转前两行:

$count = strlen($text);
$text = str_split($text);

注意

这将解决您的次要问题,并使您的算法能够在没有错误的情况下运行。它不会修复你的算法,但至少你现在可以调试它了。

您正在$count上运行循环,由于$text = str_split($text); 返回,该循环从str_len获取其值

因此,您已经覆盖了$text变量,您可以通过更改顺序先获取长度,然后拆分来修复它。