PHP排序preg_match_all数组

时间:2015-01-14 02:58:47

标签: php arrays sorting

我正在处理一个表单处理页面,该页面将获取的数据粘贴到表单中,并在提交时获取数据并将其分解为不同的匹配项。我无法确定编码以根据某些标准对日期进行排序。任何帮助都会很棒。下面是我到目前为止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>";
};
?>    

1 个答案:

答案 0 :(得分:0)

  1. 根据您的使用情况,使用preg_split()并没有任何意义。相反,您可以轻松使用$lines = explode("\n", $_POST['changeQueue']);。如果你没有使用正则表达式来做其他任何事情,这肯定是要走的路,所以你不必有启动正则表达式引擎的开销。由于你在此之后使用正则表达式,这不是什么大问题,只是一个FYI。

  2. 您的第一个preg_match()模式可以简化:'/^\d{6}/'

  3. 我不确定您是否应该使用preg_match_all()。如果你只是使用preg_match()并传入$matches参数,它将使用在索引0处匹配的整个模式填充$matches,但之后它将填充每个带括号的子 - 它匹配的模式。因此,您可以使用一维数组而不是不必要的多维数组获得所需的结果。

  4. 根据您的代码示例,$matches中有一维数组后,您的日期将显示在$matches[6]$matches[7]

  5. 现在,您似乎希望按每行的开始日期或结束日期对$lines进行排序。因此,不是循环遍历$lines,而是要调用usort()。在传递给usort()的回调中,拆分该行,获取要排序的值,并使用它们来比较这两行。然后从回调中返回-101,告诉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);