<?php

error_reporting(-1);
mb_internal_encoding('utf-8');

$text =
"Дым табачный воздух выел.
Комната -
глава в крученыховском аде.
Вспомни -
за этим окном
впервые
руки твои, исступлённый, гладил.
Сегодня сидишь вот,
сердце в железе.
День ещё -
выгонишь,
может быть, изругав.
В мутной передней долго не влезет
сломанная дрожью рука в рукав.";

/* Раскладываем стихотворный текст на куски по символу перевода строки. */
$pieces = explode("\n", $text);

/* Раскладываем массив с кусками текста на несколько массивов со всеми символами в этих кусках текста. */
$symbols = array();
foreach($pieces as $key => $piece) {
    $symbols[$key] = preg_split('//u', $piece, 0, PREG_SPLIT_NO_EMPTY);
}

/* Считаем количество символов во всех вложенных массивах в $symbols. */
$count = array();
$countedSymbols = array();
for ($i = 0; $i <= count($symbols); $i++) {
	 $count = @$symbols[$i];
	 $count = count($count);
	 array_push($countedSymbols, $count);
}

/* Находим массив с самым большим количеством символов. */
$maxSymbolsLength = max($countedSymbols);

/* Сверяем количество символов в других массивах с самым большим массивом, пропускаем через цикл в цикле все массивы, наполняя пробелами те, которые по количеству символов не дотягивают до самого большого массива. */
$space = " ";
$requiredAmount = "";
for($x = 0; $x < count($symbols); $x++) {
    $requiredAmount = $maxSymbolsLength - count($symbols[$x]);
    for($y = 0; $y < $requiredAmount; $y++) {
        array_push($symbols[$x], $space);
    }
}

/* Выводим построчно первые и последующие символы в массиве $symbols. */
$result = "";
$cell = "";
$verticalLine = " | ";
$carriageReturn = "\n";
for ($x = 0; $x < $maxSymbolsLength; $x++) {
    for ($y = 0; $y < count($symbols); $y++) {
        $cell = $symbols[$y][$x] . $verticalLine;
        $result = $result . $cell;
    }
    $result = $result . $carriageReturn;
}

echo $result;

?>