0

特定のテキストから頭字語を作成しようとしています。ここでのアイデアは、$text の最初の文字 ($text[0]) が取得され、array_push() を使用して配列 $storage 内に配置されるということです。ここで、配列内にスペースがある場合、次のインデックスの文字は頭字語の一部である必要があります。現在、出力が得られません。何が欠けていますか?

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. これは 1 回だけ発生する必要があるため、ループの外にある必要があります (これ$iは 1 から開始することを意味します)。

    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

戻り値のために配列から$count値を取得しているループを実行していますstr_len$text = str_split($text);

したがって、変数を上書きしたので$text、最初に長さを取得してから分割する順序を変更することで修正できます。

于 2012-07-26T13:41:27.093 に答える
0

最初の変数を上書きします$text

$count = strlen($text);

メソッドの最初の行で変更したため、この行$textには配列があります。

最初の2行を反転してみてください。

$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 に答える