PHP排序预匹配所有数组
我正在处理一个表单处理页面,该页面接收粘贴到表单中的数据,提交时接收数据并将其分解为不同的匹配项。我很难根据特定的标准计算出日期排序的编码。任何帮助都会很好。下面是我到目前为止为foreach循环编写的代码。此外,我包括什么样的输出看起来只是这个信息。我想能够排序的日期和其他变量 以下是运行以下代码的输出。 694345 批准 01/13-TR-OK 2015年1月13日03:32下午 2015年1月16日下午5:00 z-CHG GL网络操作 序言 691098 批准 01/05-TR-PEND*不确定是否回收附件 2015年5月1日上午9:59 2015年1月14日下午5:00 z-CHG GL网络操作 序言 代码如下:PHP排序预匹配所有数组,php,arrays,sorting,Php,Arrays,Sorting,我正在处理一个表单处理页面,该页面接收粘贴到表单中的数据,提交时接收数据并将其分解为不同的匹配项。我很难根据特定的标准计算出日期排序的编码。任何帮助都会很好。下面是我到目前为止为foreach循环编写的代码。此外,我包括什么样的输出看起来只是这个信息。我想能够排序的日期和其他变量 以下是运行以下代码的输出。 694345 批准 01/13-TR-OK 2015年1月13日03:32下午 2015年1月16日下午5:00 z-CHG GL网络操作 序言 691098 批准 01/05-TR-PEN
<?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>";
};
?>
在您的使用中,使用preg\u split()
实际上没有任何意义。相反,您可以同样轻松地使用$lines=explode(“\n”,$\u POST['changeQueue'])代码>。如果您没有将正则表达式用于其他任何事情,那么这肯定是一种方法,这样您就不会有启动正则表达式引擎的开销。因为在这之后您使用的是正则表达式,所以这没什么大不了的,仅供参考
您的第一个preg_match()
模式可以简化为:'/^\d{6}/'
我不确定您是否应该使用preg\u match\u all()
。如果只使用preg_match()
并传入$matches
参数,它将用索引0处匹配的整个模式填充$matches
,但之后它将填充匹配的每个括号子模式。因此,您可以使用一维数组而不是不必要的多维数组来获得所需的结果
一旦您在$matches
中有了一个一维数组,根据您的代码示例,您的日期看起来将在$matches[6]
和$matches[7]
中
现在,听起来您想按每行的开始日期或结束日期对$行进行排序。因此,这就是您要调用的内容,而不是在$行中循环。在传递给usort()
的回调中,拆分行,获取要排序的值,并使用这些值比较两行。然后从回调返回-1
、0
或1
,告诉PHP如何对这些行进行排序
下面是一个示例,说明这将是什么样子(未经测试):
函数解析行($line){
$pattern=/*图案到分割线*/;
预匹配($pattern,$line,$matches);
//删除数组开头的第一个元素
数组移位($matches);
//我们将为这些值命名,并将其作为关联数组返回
//这将有助于以后访问这些值
返回数组(
排列(
“票号”,
“任务序列”,
“任务类型”,
“任务状态”,
“说明”,
“开始日期”,
“结束日期”,
“阿西涅”,
“团队”,
“正常”,
),
数组\u切片($matches,0,10)
);
}
函数比较线($line1,$line2){
如果($line1['startDate']<$line1['startDate'])){
返回-1;
}else if($line1['startDate']==$line1['startDate'])){
返回0;
}否则{
返回1;
}
}
$lines=explode(“\n”,$\u POST['changeQueue']);
$parsedLines=array();
foreach($line作为$line){
如果(!preg_match('/^\d{6}/',$line)){
继续;
}
$parsedLines[]=parseLine($line);
}
usort($parsedLines,'compareLines');
变量转储($parsedLines);
这是我想要的工作方式。我现在的问题是,我是否能够添加更多函数,以便能够以不同的方式对同一日期进行排序。您只需更改compareLines
函数的功能即可。如果您想让它按降序排序,只需切换-1
和1
返回。如果我想根据特定的键值对多个键进行排序,该怎么办?然后根据日期按数字顺序排列。示例我想根据键“taskType”where taskType='Approvals'和键“normal”where normal='Emergency'进行排序。您只需修改决定行排序方式的比较方法逻辑。比较您想要的任何值,不管您想要比较它们。只需确保返回-1、0或1即可。
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);