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

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

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

Cookie

Apple

Banana

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

Apple

Banana

Cookie

и не как

Apple
Banana
Cookie

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

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

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

3 ответа

Решение

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

$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]

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

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

Вы можете сделать это, сначала используя встроенный 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;
} 
Другие вопросы по тегам