我正试图从给定的文本中形成一个首字母缩略词。这里的想法是,$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;
}
}
}
您的算法存在一些致命缺陷:
-
您在数组上调用
strlen()
,而应该调用count()
:$text = str_split($text); $count = count($text);
-
但是,您可以将字符串作为数组进行索引,因此在这种情况下不需要
str_split()
,并且可以通过删除对str_split()
的调用来保留$count = strlen( $text);
。 -
这应该只发生一次,所以它应该在循环之外(这意味着在1处启动
$i
):array_push($storage, $text[0]);
-
打印
$storage
数组的foreach
循环应该在创建首字母缩略词的循环之外。 -
您可以使用简写的
array_push()
表示法来节省调用函数的开销。向数组中添加多个元素时,应使用array_push()
。否则,这就足够了:$storage[] = $text[0];
-
你需要从你的功能中
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
变量,您可以通过更改顺序先获取长度,然后拆分来修复它。