我正在处理一个表单处理页面,该页面将获取的数据粘贴到表单中,并在提交时获取数据并将其分解为不同的匹配项。我无法确定编码以根据某些标准对日期进行排序。任何帮助都会很棒。下面是我到目前为止foreach循环的代码。此外,我只包含此信息包含输出内容。我希望能够按日期和其他变量进行排序。
以下是运行以下代码的输出。
694345 赞同 1月13日-TR-OK 2015年1月13日下午03:32 2015年1月16日下午05:00 z-CHG GL网络运营 PreApp
691098 赞同 01/05-TR-PEND *不确定是否回收附件 01/05/2015 09:59 am 2015年1月14日下午05:00 z-CHG GL网络运营 PreApp
以下是代码:
<?php
$lines = preg_split('/\n/', $_POST['changeQueue']); // Split Pasted info into an array of lines
foreach ($lines as $line){
if (!preg_match('/^\d\d\d\d\d\d/', $line)){
continue; // Skip this line if it doesn't start with a 6+ digit number
};
//Regex to capture the interesting parts from each line, should work for IE and Mozilla
$pattern = '/^(\d*)\s(\d*)\s(\S*)\s(\S*)\s(.*?)\s(\d{2}\/\d{2}\/\d{4}\s\d{2}:\d{2}\s\w\w)\s(\d{2}\/\d{2}\/\d{4}\s\d{2}:\d{2}\s\w\w)\s(.*?)\s(.*?)\s(\w*)\s?$/';
preg_match_all($pattern,$line,$matches);
//preg_match_all returns a multidimentional array of matches, [0][x] contains the original string(s) so we start with [1][0];
$ticketNumber = $matches[1][0];
#$taskSequence = $matches[2][0];
$taskType = $matches[3][0];
#$taskStatus = $matches[4][0];
$description = $matches[5][0];
$startDate = $matches[6][0];
$endDate = $matches[7][0];
#$asignee = $matches[8][0];
$team = $matches[9][0];
$normal = $matches[10][0];
// Print the variables just to verify that we caught all the info
print_r($ticketNumber);
echo "<br>";
print_r($taskType);
echo "<br>";
print_r($description);
echo "<br>";
print_r($startDate);
echo "<br>";
print_r($endDate);
echo "<br>";
print_r($team);
echo "<br>";
print_r($normal);
echo "<hr><br><br><br>";
};
?>
答案 0 :(得分:0)
根据您的使用情况,使用preg_split()
并没有任何意义。相反,您可以轻松使用$lines = explode("\n", $_POST['changeQueue']);
。如果你没有使用正则表达式来做其他任何事情,这肯定是要走的路,所以你不必有启动正则表达式引擎的开销。由于你在此之后使用正则表达式,这不是什么大问题,只是一个FYI。
您的第一个preg_match()
模式可以简化:'/^\d{6}/'
我不确定您是否应该使用preg_match_all()
。如果你只是使用preg_match()
并传入$matches
参数,它将使用在索引0处匹配的整个模式填充$matches
,但之后它将填充每个带括号的子 - 它匹配的模式。因此,您可以使用一维数组而不是不必要的多维数组获得所需的结果。
根据您的代码示例,$matches
中有一维数组后,您的日期将显示在$matches[6]
和$matches[7]
。
现在,您似乎希望按每行的开始日期或结束日期对$lines
进行排序。因此,不是循环遍历$lines
,而是要调用usort()
。在传递给usort()
的回调中,拆分该行,获取要排序的值,并使用它们来比较这两行。然后从回调中返回-1
,0
或1
,告诉PHP如何对这些行进行排序。
以下是一个示例(未经测试):
function parseLine($line) {
$pattern = /* pattern to split line */;
preg_match($pattern, $line, $matches);
// drop the first element of the beginning of the array
array_shift($matches);
// we will give names to the values and return it as an associative array
// this will help with accessing these values later on
return array_combine(
array(
'ticketNumber',
'taskSequence',
'taskType',
'taskStatus',
'description',
'startDate',
'endDate',
'asignee',
'team',
'normal',
),
array_slice($matches, 0, 10)
);
}
function compareLines($line1, $line2) {
if ($line1['startDate'] < $line1['startDate']) {
return -1;
} else if ($line1['startDate'] == $line1['startDate']) {
return 0;
} else {
return 1;
}
}
$lines = explode("\n", $_POST['changeQueue']);
$parsedLines = array();
foreach ($lines as $line) {
if (!preg_match('/^\d{6}/', $line)) {
continue;
}
$parsedLines[] = parseLine($line);
}
usort($parsedLines, 'compareLines');
var_dump($parsedLines);