排序期间保留换行符

时间:2017-12-06 18:06:34

标签: php sorting textarea concept lexicographic-ordering

虽然我使用的是PHP,但这并不一定是特定于PHP的。我想我正在寻找一个有创意的解决方案。

假设我在textarea中有一个由一个额外的新行分隔的术语列表,例如:

Cookie

Apple

Banana

我想对这些术语进行排序()并在页面提交后显示它们,以便结果如下所示:

Apple

Banana

Cookie

而不喜欢

Apple
Banana
Cookie

(前面会有两个空白行)

有人对如何做到这一点有任何建议吗?

对不起,我应该更清楚了。 textarea中的列表由用户输入,因此它可能已经包含或可能不包含额外的换行符。

3 个答案:

答案 0 :(得分:0)

包含换行符,每个数组都应该有奇数个元素,所以array.length / 2的整数值应该总是产生换行符的数量,并且还应该产生0索引中第一个单词的索引语言。

对于数组中的单词数(即从array.length / 2到数组的末尾,不包括),你可以打印单词并打印单词索引处的任何内容 - array.length / 2,这应该是换行符,直到最后一个字。如果索引是最后一个单词,则不应在之后打印换行符。

答案 1 :(得分: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;
} 

答案 2 :(得分: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]