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

时间:2012-07-26 13:36:00

标签: php

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

答案 0 :(得分:2)

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

  1. 当您应该拨打strlen()时,您正在调用数组上的count()

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

  3. 这应该只发生一次,因此它应该在循环之外(这意味着在1)开始$i

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

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

    $storage[] = $text[0];
    
  6. 您需要return函数中的某些内容,否则您将无法访问其中任何内容。

  7. 把它们放在一起,你就明白了:

    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()