Сортировка по группам регулярных выражений в PHP - PullRequest
0 голосов
/ 09 декабря 2011

У меня есть массив имен файлов этой формы:

"A - 1.2 - План этажа. ПДФ"

Мне нужно сначала отсортировать массив по категории в следующем порядке:

1. Category: A
2. Category: ESC
3. Category: C
4. Category: M
5. Category: E
6. Category: P

Тогда мне нужно отсортировать массив по номерам, следующим за категорией.

Вот пример массива для сортировки:

$arr[0] = "A - 1.0 - Title Page.PDF";
$arr[1] = "A - 2.2 - Enlarged Floor Plans";
$arr[2] = "A - 2.1.0 - Structural Details.PDF";
$arr[3] = "E - 1.0 - Electrical Title Page.PDF";
$arr[4] = "A - 1.2 - Floor Plan.PDF";
$arr[5] = "P - 1.0 - Plumbing Title Page.PDF";
$arr[6] = "A - 2.1.1 - Structural Details.PDF";
$arr[7] = "C - 1.0 - Civil Title Page.PDF";
$arr[8] = "M - 1.0 - Mechanical Title Page.PDF";
$arr[9] = "ESC - 1.0 - Erosion Control Plan.PDF";

В идеале этот массив должен был бы стать

$arr[0] = "A - 1.0 - Title Page.PDF";
$arr[1] = "A - 1.2 - Floor Plan.PDF";
$arr[2] = "A - 2.1.0 - Structural Details.PDF";
$arr[3] = "A - 2.1.1 - Structural Details.PDF";
$arr[4] = "A - 2.2 - Enlarged Floor Plans";
$arr[5] = "ESC - 1.0 - Erosion Control Plan.PDF";
$arr[6] = "C - 1.0 - Civil Title Page.PDF";
$arr[7] = "M - 1.0 - Mechanical Title Page.PDF";
$arr[8] = "E - 1.0 - Electrical Title Page.PDF";
$arr[9] = "P - 1.0 - Plumbing Title Page.PDF";

У меня есть следующее регулярное выражение для правильной группировки имен файлов:

^([A-Z]+?) ?- ?([0-9]+)\.([0-9]+)(\.([0-9]+))?.*$

Я хочу, чтобы массив был отсортирован по группе 1, затем по группе 2, а затем по группе 3. Если группа 5 существует, то сортируйте последнюю по группе 5. Игнорировать группу 4.

Может быть проще отсортировать категории лексикографически. Если так, это было бы хорошо; хотя было бы предпочтительнее, если бы они были отсортированы в порядке, указанном выше.

Есть ли способ сделать это с помощью PHP?

Ответы [ 2 ]

5 голосов
/ 09 декабря 2011

Существует функция сортировки, которая принимает метод сравнения в качестве аргумента. Вы можете использовать его, например, так:

$order = array('A', 'ESC', 'C', 'M', 'E', 'P'); // order of categories
$order = array_flip($order); // flip order array, it'll look like: ('A'=>0, 'ESC'=>1, ...)

function cmp($a, $b)
{
    global $order;

    $ma = array();
    $mb = array();
    preg_match('/^([A-Z]+?) ?- ?([0-9]+)\.([0-9]+)(?:\.([0-9]+))?.*$/', $a, $ma);
    preg_match('/^([A-Z]+?) ?- ?([0-9]+)\.([0-9]+)(?:\.([0-9]+))?.*$/', $b, $mb);

    if ($ma[1] != $mb[1]) {
        return ($order[$ma[1]] < $order[$mb[1]]) ? -1 : 1;
    }
    if ($ma[2] != $mb[2]) {
        return $ma[2] < $mb[2] ? -1 : 1;
    }
    if ($ma[3] != $mb[3]) {
        return $ma[3] < $mb[3] ? -1 : 1;
    }
    // I've changed a regex a little bit, so the last number is 4th group now
    if (@$ma[4] != @$mb[4]) { 
        return @$ma[4] < @$mb[4] ? -1 : 1;
    }
    return 0;
}
usort($arr, "cmp");
1 голос
/ 09 декабря 2011

Как насчет:

$arr[0] = "A - 1.0 - Title Page.PDF";
$arr[1] = "A - 2.2 - Enlarged Floor Plans";
$arr[2] = "A - 2.1.0 - Structural Details.PDF";
$arr[3] = "E - 1.0 - Electrical Title Page.PDF";
$arr[4] = "A - 1.2 - Floor Plan.PDF";
$arr[5] = "P - 1.0 - Plumbing Title Page.PDF";
$arr[6] = "A - 2.1.1 - Structural Details.PDF";
$arr[7] = "C - 1.0 - Civil Title Page.PDF";
$arr[8] = "M - 1.0 - Mechanical Title Page.PDF";
$arr[9] = "ESC - 1.0 - Erosion Control Plan.PDF";


function cmp($a,$b) {
    $arr_a = split(' - ', $a);
    $arr_b = split(' - ', $b);
    if ($arr_a[0] == $arr_b[0])
        return strcmp($arr_a[1], $arr_b[1]);
    return strcmp($arr_a[0], $arr_b[0]);
}

usort($arr, "cmp");
print_r($arr);

Вывод:

Array
(
    [0] => A - 1.0 - Title Page.PDF
    [1] => A - 1.2 - Floor Plan.PDF
    [2] => A - 2.1.0 - Structural Details.PDF
    [3] => A - 2.1.1 - Structural Details.PDF
    [4] => A - 2.2 - Enlarged Floor Plans
    [5] => C - 1.0 - Civil Title Page.PDF
    [6] => E - 1.0 - Electrical Title Page.PDF
    [7] => ESC - 1.0 - Erosion Control Plan.PDF
    [8] => M - 1.0 - Mechanical Title Page.PDF
    [9] => P - 1.0 - Plumbing Title Page.PDF
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...