4

假设我有一个字符串,如下所示:

$string = 'president barack obama';

现在,假设我想把它分解成一个数组,打破单词。你会认为我可以使用explode(),对吗?那行得通,但是如果我想要一个包含所有可能的从左到右的单词组合的数组呢?像这样:

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

最有效的方法是什么?


可能的解决方案:

到目前为止,我已经提出了一种可能的解决方案,但我希望你们中的一个能给我一个更好的主意。我想像这样接近这个:

  1. 正常爆发。
  2. 循环遍历每个单词。
  3. 对于每个单词,将其存储在一个数组中。然后,检查数组中是否有另一个单词(在它自己之后)。如果有,添加一个新的数组值,它由$current_word . ' ' . $new_word;. 对每个单词都这样做。

现在,这可能会奏效。但是,这似乎很烦人,恐怕其他人可能有更好的方法来做到这一点。大家有什么推荐的?是否有一个我不知道的 PHP 函数可以做到这一点?

4

2 回答 2

5

This should do what you are looking for:

$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 回答