2009-05-13 9 views
1

重複:Explode over every other wordPHPは、他のすべての単語にひねりを加えて爆発しますか?

$string = "This is my test case for an example." 

私は私が私が欲しいもの

Array('This','is','my','test','case','for','an','example.'); 

を得る' 'に基づいて爆発するならば、他のすべてのスペースのための爆発です。

私は、次のような出力を探しています:

Array( 

[0] => Array ( 

[0] => This is 
[1] => is my 
[2] => my test 
[3] => test case 
[4] => case for 
[5] => for example. 

) 

ので、基本的にすべての2つの文言フレーズが出力されます。

誰でも解決策を知っていますか?

+0

重複:http://stackoverflow.com/questions/840807/wondering-how-to-do-php-他の質問も同様です。 – Gumbo

+0

他の質問も同様の重複していますが、答えは選択されていません。 – farinspace

答えて

3

これはあなたが

機能に包ま
$string = "This is my test case for an example."; 
$tmp = explode(' ', $string); 
$result = array(); 
//assuming $string contains more than one word 
for ($i = 0; $i < count($tmp) - 1; ++$i) { 
    $result[$i] = $tmp[$i].' '.$tmp[$i + 1]; 
} 
print_r($result); 

を探しているの出力を提供します:

function splitWords($text, $cnt = 2) 
{ 
    $words = explode(' ', $text); 

    $result = array(); 

    $icnt = count($words) - ($cnt-1); 

    for ($i = 0; $i < $icnt; $i++) 
    { 
     $str = ''; 

     for ($o = 0; $o < $cnt; $o++) 
     { 
      $str .= $words[$i + $o] . ' '; 
     } 

     array_push($result, trim($str)); 
    } 

    return $result; 
} 
+0

あなたにsylviainありがとう、これは最も有用でした。私はあなたのコードの周りに私の頭を得るためにいくつかの読書を取ったが、今私はそれを得る=)私は次の挑戦だったすべての3つの単語のために働くようになった。もう一度ありがとう – azzy81

+0

も、カウント/インデックスなしの解決策(「追跡ポインタ」を使用して)を見てください。http://stackoverflow.com/questions/857441/php-explode-over-every-other-word-with- a-twist/858073#858073 – xtofl

0

2つの簡単なオプションがあります:すべての単語で分解し、ペアで再アセンブルし、正規表現を使用してexplode()の代わりに文字列を分割します。

+0

しかし、それを行う正規表現を見つけるのは簡単ではありません。私は、爆発してからペアの解決策が行く方法だと思う。 –

0
$arr = explode($string); 
$arr2 = array(); 
for ($i=0; $i<size($arr)-1; $i+=2) { 
    $arr2[] = $arr[i].' '.$arr[i+1]; 
} 
if (size($arr)%2==1) { 
    $arr2[] = $arr[size($arr)-1]; 
} 

$ arr2が解決策です。

2

代替を、「追いかけポインタ」を利用して、このスニペットになります。

$arr = explode(" ", "This is an example"); 
$result = array(); 

$previous = $arr[0]; 
array_shift($arr); 
foreach($arr as $current) { 
    $result[]=$previous." ".$current; 
    $previous = $current; 
} 

echo implode("\n", $result); 

それはインデックスとカウントを必要とするが、foreachの方法(またはarray_mapを、など)に、すべてのこれらの内部表現のものを残していないことは常に楽しいです。

+0

なぜ2つのステップの代わりに '$ previous = array_shift($ arr);'を使わないのですか? –

+0

'array_shift'が最初の要素を返すのを知りませんでした。そのような単純な。ありがとう。 – xtofl

1

ループなしの短い溶液(可変ワード数):

function splitStrByWords($sentence, $wordCount=2) { 
     $words = array_chunk(explode(' ', $sentence), $wordCount); 
     return array_map('implode', $words, array_fill(0, sizeof($words), ' ')); 
    } 
+0

はn個の単語セグメントを返しますが、前の単語にはバックパドルしません – farinspace

0
$content="This is my test case for an example"; 
    $tmp=explode(" ",$content); 
    $text = array(); 
    $b=0; 
    for ($i = 0; $i < count($tmp)/2; $i++) { 
     $text[$i] = $tmp[$b].' '.$tmp[$b + 1]; 
     $b++; 
    $b++; 
    } 
    print_r($text); 
関連する問題