0

我试图从给定的文本中形成一个首字母缩写词。这里的想法是 $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;
                }       
            }   
        }
4

4 回答 4

2

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

  1. strlen()当您应该调用时,您正在调用一个数组count()

    $text = str_split($text);
    $count = count($text);
    
  2. str_split()但是,您可以将字符串索引为数组,因此在这种情况下不需要,您可以$count = strlen( $text);通过删除对str_split().

  3. 这应该只发生一次,所以它应该在循环之外(这意味着从$i1 开始):

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

  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 进行这些修改(如有必要)。

于 2012-07-26T13:48:46.937 回答
0

你正在运行你的循环,因为 return on 正在从它的数组$count中获取它的值str_len$text = str_split($text);

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

于 2012-07-26T13:41:27.093 回答
0

你覆盖你的第一个变量$text

$count = strlen($text);

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

尝试反转前两行:

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

笔记

这将解决您的次要问题,并使您的算法能够正确运行。它不能修复你的算法,但至少你现在可以调试它。

于 2012-07-26T13:41:38.967 回答
0

str_split将字符串转换为数组。

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

于 2012-07-26T13:43:26.497 回答