PHP排序预匹配所有数组

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

我正在处理一个表单处理页面,该页面接收粘贴到表单中的数据,提交时接收数据并将其分解为不同的匹配项。我很难根据特定的标准计算出日期排序的编码。任何帮助都会很好。下面是我到目前为止为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

 $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);