Как найти решение с разбиением строки? - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть массив строк.Примерно так:

$preorder[] = "
         iPhone 7/7 plus\n
      \n
       7 32Gb Jet B 1778 AA/A - 1 550\n
       7 32Gb Jet B 1778 HN/A - 50\n
       7 32Gb Jet B 1778 - 1 500\n
       7 32Gb Jet B 1778 LE/A - 1 550\n
       7 32Gb Jet B 1778 AH/A - 1 600\n
       7 32Gb Jet B 1778 VC/A - 1 550\n
       7 32Gb Jet B 1778 MY/A - 1 550\n
       7 32Gb Jet B 1778 2B/A - 1 550\n
      \n
       7 128Gb Black 1778 2B/A - 1 550\n
       7 128Gb Black 1778 VC/A - 1 550\n
      \n
       7 256Gb Black 1778 2B/A - 1 550\n
      \n
       7 128Gb Jet B 1778 VC/A - 1 550\n
      \n
       7 256Gb Black 1778 AH/A - 1 600\n
       7 256Gb Black 1778 AA/A - 1 550\n
       7 256Gb Black 1778 HN/A - 50\n
       7 256Gb Red 1778 MY/A - 1 550\n
      \n
       7 Plus 32Gb Black 1784 2B/A - 1 800\n
      \n
       7 256Gb Jet B 1778 MY/A - 4 950\n
       7 256Gb Jet Black 1778 - 1 500\n
       7 256Gb Jet B 1778 AH/A - 1 600\n
       7 256Gb Jet B 1778 HN/A - 50\n
      \n
       7 Plus 32Gb Silver 1784 2B/A - 5 200\n
       7 Plus 32Gb Black 1784 LE/A - 1 700\n
       7 Plus 32Gb Black 1784 HN/A - 50\n
       7 Plus 32Gb Black 1784 - 1 700\n
       7 Plus 32Gb Gold 1784 HN/A - 50\n
       7 Plus 32Gb Gold 1784 LE/A - 1 700\n
       7 Plus 32Gb Gold 1784 MY/A - 1 800\n
       7 Plus 32Gb Rose 1784 MY/A - 5 200\n
      \n
       7 Plus 128Gb Black 1784 2B/A - 5 200\n
        ";

Это список некоторых продуктов, и я отправлю его в telegram.Но у телеграммы есть ограничение на длину сообщения.Поэтому, если мое сообщение содержит более 4000 символов, мне нужно разделить его на 2 сообщения.

Но это плохое решение разбивать эту строку на пустую строку.Поэтому я понятия не имею, как я могу сделать эту строку похожей на

$msg[] = "
         iPhone 7/7 plus\n
      \n
       7 32Gb Jet B 1778 AA/A - 1 550\n
       7 32Gb Jet B 1778 HN/A - 50\n
       7 32Gb Jet B 1778 - 1 500\n
       7 32Gb Jet B 1778 LE/A - 1 550\n
       7 32Gb Jet B 1778 AH/A - 1 600\n
       7 32Gb Jet B 1778 VC/A - 1 550\n
       7 32Gb Jet B 1778 MY/A - 1 550\n
       7 32Gb Jet B 1778 2B/A - 1 550\n
      \n
       7 128Gb Black 1778 2B/A - 1 550\n
       7 128Gb Black 1778 VC/A - 1 550\n";
       $msg[]="
      \n
       7 256Gb Black 1778 2B/A - 1 550\n
      \n
       7 128Gb Jet B 1778 VC/A - 1 550\n
      \n
       7 256Gb Black 1778 AH/A - 1 600\n
       7 256Gb Black 1778 AA/A - 1 550\n
       7 256Gb Black 1778 HN/A - 50\n
       7 256Gb Red 1778 MY/A - 1 550\n";
       $msg[] = "
      \n
       7 Plus 32Gb Black 1784 2B/A - 1 800\n
      \n
       7 256Gb Jet B 1778 MY/A - 4 950\n
       7 256Gb Jet Black 1778 - 1 500\n
       7 256Gb Jet B 1778 AH/A - 1 600\n
       7 256Gb Jet B 1778 HN/A - 50\n
      \n
       7 Plus 32Gb Silver 1784 2B/A - 5 200\n
       7 Plus 32Gb Black 1784 LE/A - 1 700\n";
       $msg[] = "
       7 Plus 32Gb Black 1784 HN/A - 50\n
       7 Plus 32Gb Black 1784 - 1 700\n
       7 Plus 32Gb Gold 1784 HN/A - 50\n
       7 Plus 32Gb Gold 1784 LE/A - 1 700\n
       7 Plus 32Gb Gold 1784 MY/A - 1 800\n
       7 Plus 32Gb Rose 1784 MY/A - 5 200\n
      \n
       7 Plus 128Gb Black 1784 2B/A - 5 200\n
        ";

Так что я хочу разделить строку на части и создать массив из них, а затем просто отправить ее в telegram.Моя строка может иметь длину 20000 символов.Поэтому мне нужен динамический способ разделить его.Какие-либо предложения?Thx!

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Вы можете зациклить массив разобранной новой строки и подсчитать количество символов в каждой строке.
Суммируйте его в виде msgcount и продолжайте добавлять к строке до тех пор, пока вы ниже 4000 символов, как только вы превысите 4000разделите его и создайте новый элемент массива.
Как только все циклы завершены, у вас все еще есть сообщение в str, добавьте его тоже, и все готово.
Я также добавил счетчик в массиве.

$msgcount = 0;
$str = "";
foreach(explode(PHP_EOL, $preorder[0]) as $item){
    $line = trim($item);
    $count = strlen($line);
    if($line == "") continue;

    if($msgcount + $count <= 4000){
        $str .= PHP_EOL . $line;
        $msgcount += $count+1;
    }else{
        $new[] = ["msg" => trim($str), "count" => $msgcount-1];
        $str = "";
        $msgcount = 0;
    }
}

$new[] = ["msg" => trim($str), "count" => $msgcount-1];


var_dump($new);

https://3v4l.org/JLPoU

0 голосов
/ 08 февраля 2019

Я решил свою проблему.

$lines = preg_split ('/$\R?^/m',  $preorder[1]);
        $arrays = array_chunk($lines,100);
        $new_line = [];
        foreach($arrays as $key => $value) {
            $new_line[] = implode("\r\n",$value);
        }

Спасибо @ sietse85 за массив_чанк.

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