4

次のような文字列があるとします。

$string = 'president barack obama';

さて、これを配列に分解して、言葉を壊したいとします。あなたは私がただ使うことができると思いますよねexplode()?それは機能しますが、単語の可能なすべての左から右の組み合わせの配列が必要な場合はどうなりますか?そのようです:

Array
(
    [0] => 'barack'
    [1] => 'barack obama'
    [2] => 'obama'
    [3] => 'president'
    [4] => 'president barack'
    [5] => 'president barack obama'
)

これを行うための最も効率的な方法は何ですか?


考えられる解決策:

私はこれまでに1つの可能な解決策を考え出しましたが、あなたの1人が私にもっと良いアイデアを与えてくれることを願っています。私はこのようにこれに近づくことを想像します:

  1. 正常に爆発します。
  2. 各単語をループします。
  3. 単語ごとに、配列に格納します。次に、配列内に(それ自体の後に)別の単語があるかどうかを確認します。ある場合は、で構成される新しい配列値を追加します$current_word . ' ' . $new_word;。単語ごとにこれを行います。

さて、それはおそらくうまくいくでしょう。しかし、それは煩わしいようで、他の誰かがこれを行うためのより良い方法を持っているのではないかと心配しています。皆さんは何をお勧めしますか?おそらく、私が知らないこれだけを行うPHP関数はありますか?

4

2 に答える 2

5

これはあなたが探していることをするはずです:

$string  = 'president barack obama won';
$results = getWordPermutaions($string);
print_r($results);

function getWordPermutaions($inStr) {
  $outArr   = Array();
  $tokenArr = explode(" ", $inStr);
  $pointer  = 0;
  for ($i=0; $i<count($tokenArr); $i++) {
    $outArr[$pointer] = $tokenArr[$i];
    $tokenString = $tokenArr[$i];
    $pointer++; 
    for ($j=$i+1; $j<count($tokenArr); $j++) {
      $tokenString .= " " . $tokenArr[$j];
      $outArr[$pointer] = $tokenString;
      $pointer++;
    }
  }
  return $outArr;
}

/*
$results:
Array (
        [0] => 'president'
        [1] => 'president barack'
        [2] => 'president barack obama'
        [3] => 'president barack obama won'
        [4] => 'barack'
        [5] => 'barack obama'
        [6] => 'barack obama won'
        [7] => 'obama'
        [8] => 'obama won'
        [9] => 'won'
)
*/
于 2012-08-07T02:05:59.340 に答える
3

別の実用的な解決策:

  $s = 'president barack obama won';

  function myExplode($s) {
    $ex = explode(" ", $s);
    $ec = 0;
    $x = 0;
    foreach ($ex as $word) {
      $rs = isset($res) ? sizeof($res) : 0;
      if ($rs > 0)
        for ($i=$ec-$x; $i < $rs; $i++) $res[] = "{$res[$i]} {$word}";
      $x++;
      $res[] = $word;
      $ec = sizeof($res);
      }
    return isset($res) ? $res : false;
    }

  print_r( myExplode($s) );

出力

Array
(
    [0] => president
    [1] => president barack
    [2] => barack
    [3] => president barack obama
    [4] => barack obama
    [5] => obama
    [6] => president barack obama won
    [7] => barack obama won
    [8] => obama won
    [9] => won
)
于 2012-08-07T02:29:04.187 に答える