PHP Sort preg_match_all массив

0

Я работаю над страницей процесса формы, которая берет данные, вставленные в форму, и когда они отправляются, они берут данные и разбивают их на разные совпадения. У меня возникли проблемы с определением кодировки для сортировки даты, основанной на определенных критериях. Любая помощь будет большой. Ниже приведен код, который у меня есть для цикла foreach. Также я включаю в себя то, как выглядит результат с помощью этой информации. Я хочу иметь возможность сортировать по дате и другим переменным.

Вот результат запуска приведенного ниже кода.

694345 Утверждение 01/13-TR-OK 01/13/2015 03:32 pm 01/16/2015 05:00 pm z-CHG GL Сетевые операции PreApp

691098 Утверждение 01/05-TR-PEND * Не уверен, что верните приложение shou 01/05/2015 09:59 AM 01/14/2015 05:00 pm 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>";
};
?>    
Теги:
arrays
sorting

1 ответ

0
Лучший ответ
  1. С вашим использованием нет смысла использовать preg_split(). Вместо этого вы можете так же легко использовать $lines = explode("\n", $_POST['changeQueue']); , Если вы не использовали регулярные выражения для чего-либо еще, это, безусловно, было бы возможным, поэтому у вас нет накладных расходов на запуск механизма регулярных выражений. Поскольку после этого вы используете регулярные выражения, это не имеет большого значения, а просто FYI.

  2. Ваш первый шаблон preg_match() можно упростить: '/^\d{6}/'

  3. Я не уверен, что вы должны использовать preg_match_all() любом случае. Если вы просто используете preg_match() и передаете параметр $matches matches, он будет заполнять $matches со всем шаблоном, который был сопоставлен с индексом 0, но затем после этого он заполнит каждый скобку в скобках, которую он сопоставил. Таким образом, вы получаете желаемый результат с помощью одномерного массива вместо ненужного многомерного массива.

  4. Когда у вас есть одномерный массив в $matches, на основе вашего образца кода, похоже, что ваши даты будут в $matches[6] и $matches[7].

Теперь, похоже, вы хотите сортировать $lines в начале или в конце каждой строки. Итак, вместо того, чтобы перебирать $lines, это то, что вы хотите вызвать usort(). В 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);
  • 0
    Это работает так, как я хочу. Мой вопрос сейчас заключается в том, смогу ли я добавить больше функций, чтобы иметь возможность сортировать одну и ту же дату разными способами.
  • 0
    Вы можете просто изменить функциональность функции compareLines . Если вы хотите отсортировать его в порядке убывания, просто переключите -1 и 1 .
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню