PHP: группировать слова предложения в более мелкие группы с фиксированным количеством слов - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть такое предложение:

I am in love with you

Я хочу, чтобы это было в следующей комбинации для 3 слов слева направо.

I am in
am in love
in love with
love with you

Я попробовал код ниже, но думаю, что усложняю его ...

$data = array_chunk(explode(" ", $sarr), 3);
$data = array_map(function($value) {
    return sprintf("<span>%s</span>", implode(" ", $value));
}, $data);
echo implode("\n", $data);

Есть идеи, как это сделать быстро и эффективно? Это должно работать на 5000 слов.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Вы, конечно, были в удачном начале, но вы хотите, чтобы над вашим массивом было скользящее окно. Вы можете добиться этого следующим образом:

// split the string into words
$words = explode(" ", $sarr);
// for each index in the array, get that word and the two after it
$chunks = array_map(function($i) use ($words) {
    return implode(" ", array_slice($words,$i,3));
}, array_keys($words));
// cut off the last two (incomplete) chunks
$chunks = array_slice($chunks,0,-2);
// glue the result together
echo implode("\n",$chunks);
0 голосов
/ 29 апреля 2018

Вы можете использовать регулярные выражения, чтобы обойти это. Вы сопоставляете одно слово, затем фиксируете два других следующих слова с положительным взглядом и соединяете их вместе в цикле foreach.

$words = [];
preg_match_all('~\b\w+(?=((?:\s+\w+){2}))~', $str, $matches);
foreach ($matches[0] as $key => $word) {
    // 1st iteration => $word = "I", $matches[1][0] = " am in"
    $words[] = $word . $matches[1][$key];
}

Выходы (print_r($words);):

Array
(
    [0] => I am in
    [1] => am in love
    [2] => in love with
    [3] => love with you
)

Выход echo implode(PHP_EOL, $words);:

I am in
am in love
in love with
love with you
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...