我试图从给定的文本中形成一个首字母缩略词。这里的想法是$ 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;
}
}
}
答案 0 :(得分:2)
您的算法存在一些致命缺陷:
当您应该拨打strlen()
时,您正在调用数组上的count()
:
$text = str_split($text);
$count = count($text);
但是,您可以将字符串索引为数组,因此在此方案中您不需要str_split()
,并且可以通过删除对$count = strlen( $text);
的调用来保留str_split()
。
这应该只发生一次,因此它应该在循环之外(这意味着在1)开始$i
:
array_push($storage, $text[0]);
打印foreach
数组的$storage
循环应该在创建首字母缩略词的循环之外。
您可以使用简写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进行这些修改(如有必要)。
答案 1 :(得分:0)
您正在$count
上运行循环,因为str_len
$text = str_split($text);
的值已从$text
获取
所以你已经覆盖了你的{{1}}变量,你可以通过先改变订单获取长度然后拆分来修复它。
答案 2 :(得分:0)
您覆盖了第一个变量$text
$count = strlen($text);
在这一行$text
是一个数组,因为你在方法的第一行改变了它。
尝试颠倒两行:
$count = strlen($text);
$text = str_split($text);
注意强>
这将解决您的第二个问题,并使您的算法能够正常运行。它不会修复您的算法,但至少您现在可以调试它。
答案 3 :(得分:0)
str_split
将字符串转换为数组。
str_length
带来了已经用数组覆盖的字符串的长度。你需要count()