Я пытаюсь написать функцию, которая принимает следующие 2 параметра:
Так что, если бы я должен был позвонить formatLines («Меня зовут Гэри», 2); …
Возможные результаты будут:
Это вернуло бы: массив («Мое имя», «Гари»); потому что разница в количестве символов для каждой строки настолько мала, насколько это возможно.
Таким образом, часть, на которой я в конечном итоге застрял, — это создание множества возможных результатов, в которых слова расположены в правильном порядке, разбитых на x строк. Как только у меня будет множество возможных результатов, я смогу найти лучший результат.
Итак, как бы я мог генерировать все возможные комбинации?
С уважением
Джо
Кажется, что делать это, создавая все возможные способы разделения текста, а затем определять лучший, было бы излишне неэффективно. Вы можете посчитать символы и разделить их на количество строк, чтобы найти приблизительно правильное количество символов в строке.
function lineSplitChars($text, $lines) {
if (str_word_count($text) < $lines) {
throw new InvalidArgumentException('lines must be fewer than word count', 1);
}
$width = strlen($text) / $lines; // initial width calculation
while ($width > 0) {
$result = explode("\n", wordwrap($text, $width)); // generate result
// check for correct number of lines. return if correct, adjust width if not
$n = count($result);
if ($n == $lines) return $result;
if ($n > $lines) {
$width++;
} else {
$width--;
};
}
}
Ответ был принят здесь — но это кажется мне довольно громоздким методом решения проблемы, когда PHP уже предоставляет функцию wordwrap (), которая выполняет большую часть тяжелой работы:
function format_lines($str, $lines)
{
$guess_length=(integer)(strlen($str)/($lines+1));
do {
$out=explode("\n", wordwrap($str, $guess_length));
$guess_length++;
} while ($guess_length<strlen($str) && count($out)>$lines);
return $out;
}
На самом деле это скорее метод грубой силы, и для очень больших входных данных лучшее решение будет использовать оптимальный поиск (добавление / удаление большего начального интервала, а затем уменьшение его в итерациях)