【问题标题】:Preserve Line Breaks During Sort在排序期间保留换行符
【发布时间】:2017-12-07 03:03:00
【问题描述】:

这不一定是特定于 PHP 的,尽管我使用的是 PHP。我想我正在寻找一个创造性的解决方案。

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

Cookie

Apple

Banana

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

Apple

Banana

Cookie

不喜欢

Apple
Banana
Cookie

(前面有两个空行)

有人对如何可能有任何建议吗?

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

【问题讨论】:

  • 是的,echo $array[$x] . PHP_EOL;
  • 它们是否总是被 2 个换行符分隔?
  • 理想情况下,它们将始终由两个换行符分隔。但是,它有点复杂,因为在我的情况下,如果他们已经有一个额外的新行,我不想添加第三个。

标签: php sorting textarea concept lexicographic-ordering


【解决方案1】:

如果总是有两个换行符,那么就像拆分、排序和连接一样简单:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您可以通过首先使用 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;
      } 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-27
        • 2013-11-10
        • 2015-08-16
        相关资源
        最近更新 更多