Я работаю над страницей процесса формы, которая берет данные, вставленные в форму, и когда они отправляются, они берут данные и разбивают их на разные совпадения. У меня возникли проблемы с определением кодировки для сортировки даты, основанной на определенных критериях. Любая помощь будет большой. Ниже приведен код, который у меня есть для цикла 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>";
};
?>
С вашим использованием нет смысла использовать preg_split()
. Вместо этого вы можете так же легко использовать $lines = explode("\n", $_POST['changeQueue']);
, Если вы не использовали регулярные выражения для чего-либо еще, это, безусловно, было бы возможным, поэтому у вас нет накладных расходов на запуск механизма регулярных выражений. Поскольку после этого вы используете регулярные выражения, это не имеет большого значения, а просто FYI.
Ваш первый шаблон preg_match()
можно упростить: '/^\d{6}/'
Я не уверен, что вы должны использовать preg_match_all()
любом случае. Если вы просто используете preg_match()
и передаете параметр $matches
matches, он будет заполнять $matches
со всем шаблоном, который был сопоставлен с индексом 0, но затем после этого он заполнит каждый скобку в скобках, которую он сопоставил. Таким образом, вы получаете желаемый результат с помощью одномерного массива вместо ненужного многомерного массива.
Когда у вас есть одномерный массив в $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);
compareLines
. Если вы хотите отсортировать его в порядке убывания, просто переключите-1
и1
.