Сохранить разрывы строк во время сортировки

Это не обязательно зависит от PHP, хотя я использую PHP. Я думаю, я ищу творческое решение.

Скажем, у меня есть список терминов в текстовой области, которые разделены дополнительной новой строкой, например:

Cookie

Apple

Banana

Я хочу отсортировать () эти термины и отобразить их после отправки страницы, чтобы результаты выглядели так:

Apple

Banana

Cookie

и не как

Apple
Banana
Cookie

(которому предшествуют две пустые строки)

У кого-нибудь есть предложения о том, как это возможно?

Извините, мне следовало быть более ясным. Список в текстовой области вводится пользователем, поэтому он может содержать или не содержать дополнительные символы новой строки.

0

Решение

Если всегда есть две новые строки, то это так же просто, как расщепление, сортировка и объединение:

$result = explode("\n\n", $text);
sort($result);
$result = implode("\n\n", $result);

Если это может быть один или несколько символов новой строки, то:

preg_match_all("/^(.+$)(\n+)?/m", $text, $matches);

sort($matches[1]);

$result = '';
foreach($matches[1] as $key => $val) {
$result .= $val . $matches[2][$key];
}
  • Соответствовать всему тексту строки $matches[1] и завершающие символы новой строки (если есть) $matches[2]
  • Сортировать текстовый массив строк $matches[1]
  • Цикл текстового массива строки $matches[1] и добавьте соответствующие новые строки (если есть) $matches[2]
0

Другие решения

Включая символы новой строки, каждый массив должен иметь нечетное количество элементов, поэтому целочисленное значение array.length / 2 должно всегда давать число строк новой строки, а также индекс первого слова на языке с 0 индексами.

Для количества слов в массиве (т.е. от array.length / 2 до конца массива, исключая) вы можете напечатать слово и напечатать все, что находится в индексе слова — array.length / 2, которое должно быть перевод строки, до последнего слова. Новая строка не должна быть напечатана позже, если индекс имеет последнее слово.

0

Вы можете сделать это, сначала используя встроенный PHP explode() функция для извлечения массива из вашей строки в вашей текстовой области, используя 2 символа новой строки между элементами списка (один для перемещения на новую строку из строки, где находится фактический текст, а другой для пустой строки после) в качестве разделителя взорваться дальше. Сортируйте этот массив, а затем восстановите из него вашу строку, добавив вручную новые строки.

Функция ниже демонстрирует, как это достигается и МОЖЕТ БЫТЬ ПРЯМО применимо к вашим потребностям, иначе направит вас в правильном направлении:

function sort_list_with_line_breaks($list_string){

$return_list = '';

// Break the string on newline followed by blank line into array
$list_array = explode("\n\n", $list_string);

// Apply your sorting
sort($list_array);

// Reconstruct string
$count = 0;
foreach($list_array as $string){
if($count == count($list_array)){ break; }
if($count != 0){ $return_list .= "\n\n"; }
$return_list .= $string;
$count++;
}

return $return_list;
}
0