Предположим, что у меня есть строка, например:
$string = 'president barack obama';
Теперь предположим, что я хочу взорвать это в массив, сломав слова. Вы думаете, я могу просто использовать explode()
, правильно? Это работает, но что, если я хочу массив всех возможных комбинаций слов слева направо? Вот так:
Array ( [0] => 'barack' [1] => 'barack obama' [2] => 'obama' [3] => 'president' [4] => 'president barack' [5] => 'president barack obama' )
Каков наиболее эффективный способ сделать это?
До сих пор я придумал одно возможное решение, но я надеюсь, что один из вас может дать мне лучшую идею. Я предполагаю, что это так:
$current_word . ' ' . $new_word;
$current_word . ' ' . $new_word;
, Сделайте это для каждого слова. Теперь это, вероятно, сработает. Однако это кажется раздражающим, и я боюсь, что у кого-то может быть лучший способ сделать это. Что вы все рекомендуете? Есть ли, возможно, функция PHP, которая делает именно это, о котором я не знаю?
Это должно делать то, что вы ищете:
$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' ) */
Другое рабочее решение:
$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 )