Вам нужно будет выбрать все значение, а затем обработать строку в коде. В зависимости от того, что вы пытаетесь сделать со словами, вы можете использовать регулярные выражения для соответствия определенным словам / буквам.
Вам необходимо использовать 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
)
Приведенный ниже метод работает, пытаясь разделить клавиши на тире. Затем выполняется сравнение по второй части (индекс 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',
)
Если я правильно понял, вам нужно использовать функцию uksort()
. Это позволяет вам написать свой собственный компаратор. Но как насчет индексов без месяца и даты после% monthname%?