Разбиение строки по условию?

Добрый вечер! Очень нуждаюсь в помощи с следующей задачей. Есть своего рода рассылка товаров, общее количество символов в которой будет привешать лимит на размер сообщения. Соответственно нужно разбить рассылку на несколько частей. Но тут нельзя разбить по каждому \n. Поскольку значения в строке имеют определнный порядок и нарушать этот порядок нельзя.

Например, ниже есть массив строк, один элемент массива = 1 сообщение. Элемент массива с условными Iphone 7 превышает лимит на размер сообщения. Самым простым решениенм, было бы
preg_split("\n", $preorder[$k]
Просто разбить строку по символу \n и получить массив не вариант, потому, что я могу получить, ситуацию, когда в одном элементе массива будет 40 строк, а вдругом 3 или вообще 1 строка. А отправлять сообщение в котором одна строка, так себе идея.

Суть в том, что массив имеет следующий вид

$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
       7 128Gb Black 1778 HN/A - 50\n
       7 128Gb Jet B 1778 - 1 500\n
       7 128GB Jet B 1778 AH/A - 1 600\n
       7 128Gb Jet B 1778 LE/A - 1 550\n
       7 128Gb Jet B 1778 MY/A - 4 950\n
       7 128Gb Jet B 1778 HN/A - 50\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
       7 256Gb Jet B 1778 AA/A - 1 550\n
       7 256Gb Jet B 1778 LE/A - 1 550\n
       7 256Gb Jet B 1778 VC/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
      \n
       7 Plus 32Gb Rose 1784 - 1 700\n
       7 Plus 32Gb Rose 1784 LE/A - 5 100\n
       7 Plus 32Gb Rose 1784 VC/A - 5 050\n
       7 Plus 32Gb Rose 1784 HN/A - 50\n
       7 Plus 32Gb Rose 1784 AA/A - 1 600\n
       7 Plus 32Gb Red 1784 HN/A - 50\n
       7 Plus 32Gb Rose 1784 AH/A - 1 800\n
      \n
       7 Plus 128Gb Silver 1784 2B/A - 1 800\n
      \n
       7 Plus 32Gb Jet B 1784 HN/A - 50\n
       7 Plus 32Gb Jet B 1784 VC/A - 1 600\n
       7 Plus 32Gb Jet B 1784 MY/A - 1 800\n
       7 Plus 32Gb Jet B 1784 LE/A - 1 700\n
      \n
       7 Plus 128Gb Gold 1784 2B/A - 5 200\n
      \n
       7 PLus 32Gb Jet B 1784 AH/A - 5 250\n
       7 Plus 32Gb Jet B 1784 AA/A - 1 600\n
       7 Plus 32Gb Jet B 1784 - 1 700\n
      \n
       7 Plus 128Gb Black 1784 HN/A - 50\n
       7 Plus 128Gb Rose 1784 2B/A - 1 800\n
       7 Plus 128Gb Black 1784 - 1 700\n
       7 Plus 128Gb Gold 1784 MY/A - 1 800\n
       7 Plus 128Gb Rose 1784 MY/A - 1 800\n
       7 Plus 128Gb Rose 1784 AH/A - 1 800\n
       7 Plus 128Gb Rose 1784 HN/A - 50\n
      \n
       7 Plus 256Gb Black 1784 2B/A - 1 800\n
      \n
       7 Plus 128Gb Rose 1784 LE/A - 1 700\n
       7 Plus 128Gb Rose 1784 VC/A - 1 600\n
       7 Plus 128Gb Rose 1784 AA/A - 1 600\n
       7 Plus 128Gb Rose 1784 - 1 700\n
       7 Plus 128Gb Red 1784 AH/A - 5 250\n
       7 Plus 128Gb Red 1784 - 1 700\n
      \n
       7 Plus 256Gb Silver 1784 2B/A - 1 800\n
      \n
       7 Plus 128Gb Jet B 1784 VC/A - 1 600\n
       7 Plus 128Gb Jet B 1784 MY/A - 1 800\n
       7 Plus 128Gb Jet B 1784 AA/A - 5 050\n
      \n
       7 Plus 256Gb Gold 1784 2B/A - 1 800\n
      \n
       7 Plus 128Gb Jet B 1784 LE/A - 1 700\n
      \n
       7 Plus 256Gb Black 1784 AH/A - 5 250\n
       7 Plus 256Gb Black 1784 VC/A - 1 600\n
       7 Plus 256Gb Rose 1784 2B/A - 5 200\n
       7 Plus 256Gb Black 1784 - 1 700\n
       7 Plus 256Gb Black 1784 LE/A - 1 700\n
       7 Plus 256Gb Jet B 1784 MY/A - 1 800\n
       7 Plus 256Gb Jet B 1784 LE/A - 1 700\n
       7 Plus 256Gb Jet B 1784 VC/A - 1 600\n
       7 Plus 256Gb Jet B 1784 AH/A - 1 800\n
       7 Plus 256Gb Jet B 1784 - 1 700\n
        ";

А нужно получить
$msg = [];

        $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";
      $msg[] ="
      \n
       7 128Gb Black 1778 2B/A - 1 550\n
       7 128Gb Black 1778 VC/A - 1 550\n
       7 128Gb Black 1778 HN/A - 50\n
       7 128Gb Jet B 1778 - 1 500\n
       7 128GB Jet B 1778 AH/A - 1 600\n
       7 128Gb Jet B 1778 LE/A - 1 550\n
       7 128Gb Jet B 1778 MY/A - 4 950\n
       7 128Gb Jet B 1778 HN/A - 50\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
       7 256Gb Jet B 1778 AA/A - 1 550\n
       7 256Gb Jet B 1778 LE/A - 1 550\n
       7 256Gb Jet B 1778 VC/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
       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
      \n
       7 Plus 32Gb Rose 1784 - 1 700\n
       7 Plus 32Gb Rose 1784 LE/A - 5 100\n
       7 Plus 32Gb Rose 1784 VC/A - 5 050\n
       7 Plus 32Gb Rose 1784 HN/A - 50\n";

Буду крайне признателен за помощь!
  • Вопрос задан
  • 49 просмотров
Решения вопроса 1
@Ka4_Piton Автор вопроса
Совсем немного подумал и решение казалось бы, изначально сложной для меня задачи было решено за 5 минут.
$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);
        }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
romanko_vn
@romanko_vn
Как то так можно.

$arr = preg_split('/\n/u',$str);
$arr_format = preg_filter('/\s+/', ' ', $arr);
$arr_no_empty = preg_grep('/\w+/', $arr_format);
print_r(array_chunk($arr_no_empty, 7));
Ответ написан
Ваш ответ на вопрос

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

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