@Arx777

Как сделать перенос строки по пробелу?

Нужно сделать перенос строк (записывать в массив)по пробелу по заданному размеру длины строки.

Пример:
$text = 'Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки. Если вызвана статически, возвращает объект класса DOMDocument или FALSE в случае возникновения ошибки.';
class MyClass {

    public $output = array();

    public function text($text, $string_length){
         print_r($output);
    }

}
$obj = new MyClass();
$obj->text($text, 20);


должно получиться:
Array ( [0] => Возвращает TRUE в [1] => случае успешного завершения [2] => или FALSE в случае возникновения [3] => ошибки. Если вызвана статически, [4] => возвращает объект класса DOMDocument [5] => или FALSE в случае возникновения )


Я решил таким путем:
class MyClass {

    public $output = array();

    public function text($text, $string_length){

        $i = 0;
        foreach(explode(' ', $text) as $val){
            if(!empty($this->output[$i])){
                if(iconv_strlen($this->output[$i], 'utf-8') < $string_length){
                    $this->output[$i] .= $val.'  ';
                } else {
                    ++$i;
                    if(isset($this->output[$i])){$this->output[$i] .= $val.'  ';}
                }
            } else {
                $this->output[$i] = $val.' ';
            }
        }
        print_r($this->output);
    }

}

$obj = new MyClass();
$obj->text($text, 20);


Но результат не верен:
Array ( [0] => Возвращает TRUE в [1] => успешного завершения [2] => FALSE в случае возникновения [3] => Если вызвана статически, [4] => объект класса DOMDocument [5] => FALSE в случае возникновения )


Пропадает начиная с array [1].
Т.е. должно быть: [0] => Возвращает TRUE в [1] => СЛУЧАЕ успешного
А слово СЛУЧАЕ теряется и вместо него вставляется завершения

Не претендую, что мой алгоритм лучший, но уже перепробовал несколько различных способов и этот вышел ближе всего к истине.
  • Вопрос задан
  • 276 просмотров
Решения вопроса 1
function stringSplit($text, $maxRowLength) {
    $result = [];
    $words = explode(' ', $text);

    $nextRow = '';
    foreach ($words as $word) {
        $calculatedRow = $nextRow . ' ' . $word;

        if (iconv_strlen($calculatedRow, 'utf-8') <= $maxRowLength) {
            $nextRow = $calculatedRow;
        } else {
            $result[] = trim($nextRow);
            $nextRow = $word;
        }
    }

    $result[] = trim($nextRow);

    return $result;
}

$text = 'Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки. Если вызвана статически, возвращает объект класса DOMDocument или FALSE в случае возникновения ошибки.';
var_export(stringSplit($text, 25));
echo PHP_EOL;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы