PHP Использование str_word_count с strsplit для формирования массива после x слов

У меня есть большая строка, которую я хочу поместить в массив после каждых 50 слов. Я думал об использовании strsplit для вырезания, но понял, что не будет принимать во внимание слова, просто разделится, когда дойдет до x char.

Я читал о str_word_count, но не могу понять, как соединить их вместе.

Что у меня есть на данный момент:

$outputArr = str_split($output, 250);

foreach($outputArr as $arOut){

echo $arOut;
echo "<br />";

}

Но я хочу заменить это, чтобы сформировать каждый элемент массива из 50 слов вместо 250 символов.

Любая помощь будет высоко ценится.


person MissCoder87    schedule 29.08.2012    source источник
comment
не по теме: ваша страница скоро будет потрясающей =)   -  person    schedule 29.08.2012


Ответы (2)


Предполагая, что str_word_count достаточно для ваших нужд¹, вы можете просто вызвать его с 1 в качестве второго параметра, а затем использовать array_chunk для группировки слов в группы по 50:

$words = str_word_count($string, 1);
$chunks = array_chunk($words, 50);

Теперь у вас есть массив массивов; чтобы объединить каждые 50 слов и сделать их массивом строк, которые вы можете использовать

foreach ($chunks as &$chunk) { // important: iterate by reference!
    $chunk = implode(' ', $chunk);
}

¹ Скорее всего, это не так. Если вы хотите получить приемлемые для большинства людей результаты при обработке письменного языка, вам придется использовать preg_split с подходящим регулярным выражением.

person Jon    schedule 29.08.2012
comment
Как насчет слов, разделенных чем-то, кроме ` `? - person raina77ow; 29.08.2012
comment
@ raina77ow: Сначала вам нужно будет дать железное определение слова. Затем preg_split. - person Jon; 29.08.2012
comment
Нет, это другой вопрос. Например, предыдущее предложение будет реконструировано как No that is another question - по крайней мере, если , не считается частью слова No. - person raina77ow; 29.08.2012
comment
@raina77ow: Это из-за того, как str_word_count обрабатывает текст. Я прямо упоминаю, что этого вряд ли будет достаточно для письменного языка. Регулярные выражения будут уродливыми (например, см. это, и даже это может не быть достаточно хорошим). - person Jon; 29.08.2012
comment
Если вы хотите, чтобы пунктуация была включена, вы можете передать строку пунктуации в качестве третьего параметра. Например. str_word_count($string, 1, ',!?.;:'); - person James Arnold; 29.08.2012

Есть еще один способ:

<?php

$someBigString = <<<SAMPLE
  This, actually, is a nice' old'er string, as they said, "divided and conquered".
SAMPLE;

// change this to whatever you need to:     
$number_of_words = 7; 

$arr = preg_split("#([a-z]+[a-z'-]*(?<!['-]))#i", 
  $someBigString, $number_of_words + 1, PREG_SPLIT_DELIM_CAPTURE);

$res = implode('', array_slice($arr, 0, $number_of_words * 2));
echo $res;

Демо.

Я считаю preg_split лучшим инструментом (чем str_word_count) здесь. Не потому, что последний негибкий (это не так: вы можете определить, какие символы могут составлять слово с его третьим параметром), а потому, что preg_split по существу прекратит обработку строки после получения N элементов.

Хитрость, довольно распространенная с этой функцией, заключается в том, чтобы также захватить разделители, а затем использовать их для восстановления строки с первыми N словами (где N задано) И сохраненными знаками препинания.

(конечно, регулярное выражение, используемое в моем примере, не строго соответствует поведению, зависящему от локали str_word_count. Но оно по-прежнему ограничивает слова состоящими из символов альфа, ' и -, причем последние два не должны быть в начале и в конце любого слово).

person raina77ow    schedule 29.08.2012
comment
Если я неправильно понял ваш вопрос, и вам действительно нужно разбить строку на 50 слов, это решение тоже можно использовать, но основная причина использования preg_split будет потеряна. ) Вместо этого используйте решение Джона. - person raina77ow; 29.08.2012