2012-07-26 87 views
0

我想从给定的文本形成首字母缩略词。这里的想法是$ text中的第一个字母($ text [0])将被采用,并使用array_push()放置在数组$ storage中。现在,如果数组内有空格,则下一个索引的字母应该是Acronym的一部分。我目前没有获得输出,我错过了什么?没有输出? PHP的foreach似乎没有工作

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

请提供示例输入和输出 – VolkerK 2012-07-26 13:38:52

+1

您的算法实现和解释是两个完全不同的事情。 – nickb 2012-07-26 13:39:15

+0

你如何调用这个函数和你收到什么输出? – FatalError 2012-07-26 13:39:29

回答

2

你的算法从几个致命的缺陷所害:

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

+0

谢谢@nickb。伟大的帮助:) – user1242749 2012-07-26 13:59:27

+0

嘿@nickb,只是一个简单的问题。假设我想获得数组的最后一个字,并且可能array_push在数组上,它是如何做到的?例如,如果我要输入自动柜员机,那么输出就像ATM机。我该如何去做呢? – user1242749 2012-07-26 14:30:25

+0

另外一个(文体)错误:不要将您的函数缩写为大写字母A.当其他人读取您的代码时,他们会认为它是一个类,而不是函数。 – Doa 2012-07-26 14:48:09

0

你在$count是从str_len获取其价值的,因为在$text = str_split($text);

所以,你必须覆盖您的$text变量返回的数组运行你的循环中,您可以通过更改为了得到长先解决它然后分裂。

0

您覆盖第一个变量$text

$count = strlen($text); 

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

尝试反转两个第一线:

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

注意

这将解决你的第二个问题,并让你的算法要无差错地运行。它不能修复你的算法,但至少你现在可以调试它。

0

str_split将字符串转换为数组。

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