Просьба помочь с данной функцией. Смысл в том, что передавая текст и максимально допустимое кол-во символов, он разбивает его на части, в соответствие с этим значение и пишет в массив. Все работает, за исключением того, что не могу корректно составить условие прекращения рекурсии...В данном случае остаток текста, самый последний элемент, в массив не пишется.
$this->text['source'] - исходный текст
$this->text['length'] - допустимая длинна символов в одно части
private function partition() {
$this->inner['textLength'] = strlen($this->text['source']);
$this->inner['positionEnd'] = strpos($this->text['source'], " ", $this->text['length']);
$this->part[] = substr($this->text['source'], 0, $this->inner['positionEnd']);
$this->text['source'] = substr($this->text['source'], $this->inner['positionEnd']);
if(($this->inner['textLength'] - $this->inner['positionEnd']) < $this->text['length']) {
return $text;
}
$this->partition();
}
Спустя 18 минут, 9 секунд (22.07.2012 - 16:49) dadli написал(а):
Gesandte
?
$str = "Просьба помочь с данной функцией";
$length = 3;
preg_match_all("#.{".$length."}|.{1,".$length."}$#iu",$str,$mas);
echo '<pre>';
var_dump($mas);
echo '</pre>';
?
Спустя 13 минут, 51 секунда (22.07.2012 - 17:03) kamanch написал(а):
Цитата |
return $text; |
А это что такое? Может быть $this->text
А вообще, класс бы выложил со свойствами, а то не очень понятно.
Спустя 4 минуты, 22 секунды (22.07.2012 - 17:08) Gesandte написал(а):
dadli, спасибо)
но немного не то, по тексту не упомянул, в коде видно
слова пополам не режем, а ищем их окончания..
но немного не то, по тексту не упомянул, в коде видно
$this->inner['positionEnd'] = strpos($this->text['source'], " ", $this->text['length']);
слова пополам не режем, а ищем их окончания..
Спустя 4 минуты, 56 секунд (22.07.2012 - 17:12) Gesandte написал(а):
h.n.81 , честно сам думал почему $text и откуда.....)
Тестовый пример
Тестовый пример
class format {
public $text;
private $part = array();
private $inner = array();
private function partition() {
$this->inner['textLength'] = strlen($this->text['source']);
$this->inner['positionEnd'] = strpos($this->text['source'], " ", $this->text['length']);
$this->part[] = substr($this->text['source'], 0, $this->inner['positionEnd']);
$this->text['source'] = substr($this->text['source'], $this->inner['positionEnd']);
echo $this->inner['positionEnd']." == ".$this->text['length'];
echo "<br />";
if(($this->inner['textLength'] - $this->inner['positionEnd']) < $this->text['length']) {
return;
}
$this->partition();
}
public function formatText() {
# Форматируем текст
$this->partition();
# Считаем количество элементов в массиве
$countElements = count($this->part);
$i = "0";
# Прогоняем массив
foreach ($this->part as $part) {
# Выводим сожержимое
echo $part;
$i++;
# Вставляем разделитель
if ($countElements !== $i) {
echo "<br /> --- <br />";
}
}
}
}
$format = new format;
$format->text['source'] = "B Mansory predstavili tuningoviy Aventador c polnostiu karbonovim kuzovom. Noviy Lamborghini Aventador Carbon";
$format->text['length'] = "10";
echo $format->formatText();
Спустя 12 минут, 11 секунд (22.07.2012 - 17:25) dadli написал(а):
Gesandte
что-то не понял какои резултат ви хотите получить? например есть такои текст
$text = "a b ssdd fghjberbernetnkl";
и длина: 5
какои резултат ви хотите получить из етого текста?
что-то не понял какои резултат ви хотите получить? например есть такои текст
$text = "a b ssdd fghjberbernetnkl";
и длина: 5
какои резултат ви хотите получить из етого текста?
Спустя 21 минута, 45 секунд (22.07.2012 - 17:46) Gesandte написал(а):
dadli,
1 - a b ssdd
2 - fghjberbernetnkl
тексты планируются достаточно большие, поэтому погрешность +/- несколько символов безразлична
1 - a b ssdd
2 - fghjberbernetnkl
тексты планируются достаточно большие, поэтому погрешность +/- несколько символов безразлична
Спустя 16 минут, 10 секунд (22.07.2012 - 18:03) kamanch написал(а):
Ты проверил, что там в строке осталось? Меньше 10? Ага... тогда выходим... а остаток строки забыли и потеряли...
Исправляй на:
Исправляй на:
if(($this->inner['textLength'] - $this->inner['positionEnd']) < $this->text['length']) {
$this->part[] = $this->text['source'];
return;
}
Спустя 6 минут, 48 секунд (22.07.2012 - 18:09) Gesandte написал(а):
h.n.81 и вправду, спасибо)
Спустя 16 минут, 17 секунд (22.07.2012 - 18:26) killer8080 написал(а):
Gesandte
так?
так?
$length = 25;
$text = 'тексты планируются достаточно большие, поэтому погрешность +/- несколько символов безразлична';
$words = explode(' ', $text);
$from = 0;
$n = 0;
$count = 0;
$parts = array();
foreach($words as $word){
$count += mb_strlen($word, 'UTF-8');
$n++;
if($count >= $length){
$parts []= implode( ' ', array_slice($words, $from, $n - $from) );
$from = $n;
$count = 0;
}
}
echo '<pre>'.print_r($parts, 1).'</pre>';
Спустя 47 минут, 14 секунд (22.07.2012 - 19:13) Gesandte написал(а):
killer8080, как то не так работает...
при $length = 10;
на выходе имеем
Array
(
[0] => тексты планируются достаточно большие,
[1] => поэтому погрешность +/- несколько
)
а должны примерно так,
Array
(
[0] => тексты планируются
[1] => достаточно
[2] => большие, поэтому
[3] => погрешность
[4] => +/- несколько
)
и окончание режет, не выводит
при $length = 10;
на выходе имеем
Array
(
[0] => тексты планируются достаточно большие,
[1] => поэтому погрешность +/- несколько
)
а должны примерно так,
Array
(
[0] => тексты планируются
[1] => достаточно
[2] => большие, поэтому
[3] => погрешность
[4] => +/- несколько
)
и окончание режет, не выводит
Спустя 3 минуты, 46 секунд (22.07.2012 - 19:17) killer8080 написал(а):
Цитата (Gesandte @ 22.07.2012 - 19:13) |
killer8080, как то не так работает... при $length = 10; |
у меня так
Array
(
[0] => тексты планируются
[1] => достаточно
[2] => большие, поэтому
[3] => погрешность
[4] => +/- несколько
[5] => символов безразлична
)
Кодировку правильно указываешь для mb_strlen?
Спустя 2 минуты, 9 секунд (22.07.2012 - 19:19) Gesandte написал(а):
действительно, забыл перекодировать файл в ютф, спасибо)