Массив php sort с использованием ключей месяцев игнорирует другой ключ

Вам нужно будет выбрать все значение, а затем обработать строку в коде. В зависимости от того, что вы пытаетесь сделать со словами, вы можете использовать регулярные выражения для соответствия определенным словам / буквам.

3
задан guradio 18 January 2019 в 02:09
поделиться

3 ответа

Вам необходимо использовать uksort для сравнения клавиш. Эта функция обратного вызова будет сортировать ключи с датой в начале (основываясь на том факте, что в этих ключах есть 6-значная строка YYYYMM) и затем сортировать по датам. Не датированные ключи отсортированы в алфавитном порядке.

uksort($array, function ($k1, $k2) {
    if (preg_match('/^\w+-(\d{6})_\w+$/', $k1, $m1)) {
        if (preg_match('/^\w+-(\d{6})_\w+$/', $k2, $m2)) {
            // both have dates, sort on that
            return strcmp($m1[1], $m2[1]);
        }
        else {
            // dates sort first
            return -1;
        }
    }
    elseif (preg_match('/^\w+-(\d{6})_\w+$/', $k2, $m2)) {
        // dates sort first
        return 1;
    }
    else {
        // neither is a date, sort alphabetically
        return strcmp($k1, $k2);
    }
});

Вывод:

Array (
    [January-201901_UE] => 1
    [January-201901_QTY] => 1
    [February-201902_QTY] => 1
    [February-201902_UE] => 1
    [March-201903_UE] => 1
    [March-201903_QTY] => 1
    [April-201904_UE] => 1
    [April-201904_QTY] => 1
    [May-201905_UE] => 1
    [May-201905_QTY] => 1
    [June-201906_QTY] => 1
    [June-201906_UE] => 1
    [July-201907_UE] => 1
    [July-201907_QTY] => 1
    [strMachineGroup] => 1
    [strMachineGroupID] => MC000027
    [strMachineGroupIDUE] => MC000027 
)

Демо на 3v4l.org

0
ответ дан Nick 18 January 2019 в 02:09
поделиться

Приведенный ниже метод работает, пытаясь разделить клавиши на тире. Затем выполняется сравнение по второй части (индекс 1), если доступно, если не сделано сравнение с ключом.

Пример сравнения ключей July-201906_QTY и June-201906_QTY приведёт к сравнению между 201906_QTY и 201906_QTY в uksort.

Числа будут всплывать наверху заказа. Грунтовая работа выполняется через оператора космического корабля.

<?php
$data =
[
    'strMachineGroupID' => MC000027,
    'strMachineGroup' => 1,
    'April-201904_QTY' => 1,
    'February-201902_QTY' => 1,
    'January-201901_QTY' => 1,
    'July-201907_QTY' => 1,
    'June-201906_QTY' => 1,
    'March-201903_QTY' => 1,
    'May-201905_QTY' => 1,
    'strMachineGroupIDUE' => MC000027,
    'April-201904_UE' => 1.00,
    'February-201902_UE' => 1.00,
    'January-201901_UE' => 1.00,
    'July-201907_UE' => 1.00,
    'June-201906_UE' => 1.00,
    'March-201903_UE' => 1.00,
    'May-201905_UE' => 1.00
];

uksort($data, function($a, $b) {
    $parts_a = explode('-', $a);
    $parts_b = explode('-', $b);

    return ($parts_a[1] ?? $a) <=> ($parts_b[1] ?? $b);
});

var_export($data);

Вывод:

array (
'January-201901_QTY' => 1,
'January-201901_UE' => 1.0,
'February-201902_QTY' => 1,
'February-201902_UE' => 1.0,
'March-201903_QTY' => 1,
'March-201903_UE' => 1.0,
'April-201904_QTY' => 1,
'April-201904_UE' => 1.0,
'May-201905_QTY' => 1,
'May-201905_UE' => 1.0,
'June-201906_QTY' => 1,
'June-201906_UE' => 1.0,
'July-201907_QTY' => 1,
'July-201907_UE' => 1.0,
'strMachineGroup' => 1,
'strMachineGroupID' => 'MC000027',
'strMachineGroupIDUE' => 'MC000027',
)
0
ответ дан Progrock 18 January 2019 в 02:09
поделиться

Если я правильно понял, вам нужно использовать функцию uksort() . Это позволяет вам написать свой собственный компаратор. Но как насчет индексов без месяца и даты после% monthname%?

0
ответ дан Nick 18 January 2019 в 02:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: