在排序过程中保留换行符
Preserve Line Breaks During Sort
这不一定是 PHP 特定的,尽管我使用的是 PHP。我想我正在寻找一个创造性的解决方案。
假设我在文本区域中有一个术语列表,这些术语由额外的换行符分隔,例如:
Cookie
Apple
Banana
我想对这些术语进行排序()并在页面提交后显示它们,以便结果如下所示:
Apple
Banana
Cookie
不喜欢
Apple
Banana
Cookie
(前面会有两个空行)
有人对如何实现有任何建议吗?
对不起,我应该更清楚。文本区域中的列表由用户输入,因此它可能包含也可能不包含额外的换行符。
包括换行符在内,每个数组都应该有奇数个元素,所以 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;
}
如果总是有两个换行符,那么就像拆分、排序和连接一样简单:
$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]
这不一定是 PHP 特定的,尽管我使用的是 PHP。我想我正在寻找一个创造性的解决方案。
假设我在文本区域中有一个术语列表,这些术语由额外的换行符分隔,例如:
Cookie
Apple
Banana
我想对这些术语进行排序()并在页面提交后显示它们,以便结果如下所示:
Apple
Banana
Cookie
不喜欢
Apple
Banana
Cookie
(前面会有两个空行)
有人对如何实现有任何建议吗?
对不起,我应该更清楚。文本区域中的列表由用户输入,因此它可能包含也可能不包含额外的换行符。
包括换行符在内,每个数组都应该有奇数个元素,所以 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;
}
如果总是有两个换行符,那么就像拆分、排序和连接一样简单:
$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]