php расширенная сортировка сначала по номерам, а затем по алфавиту

У меня есть массив элементов, которые я хочу отсортировать сначала по номерам, а затем по алфавиту: как вы можете видеть на изображении ниже, некоторые строки содержат числовые значения, такие как (12 дюймов, 10 дюймов и т. д.). То, что я хочу, это: 6 дюймов, 8 дюймов, 9 дюймов, 10 дюймов, 12 дюймов, Атлетик... Вестерн.

Текущий алгоритм usort выглядит так:

usort($facets['style'], function ($a, $b)  {                
            return (intval($a['value']) < intval($b['value'])) ? 1 : strcmp($a['value'], $b['value']);                              
});

введите здесь описание изображения

Спасибо!


person XTRUST.ORG    schedule 05.10.2020    source источник


Ответы (2)


Я думаю, вы ищете strnatcmp или natsort

$a = [
    'a', '12 inch', '10 inch', '5 inch','z','b'
];
    
$b = $a;
    
// way 1 (keys are lost)
usort($a, function ($a, $b)  {                
    return (strnatcmp($a,$b));                              
});

print_r($a);

// way 2 (keys are preserved)
natsort($b);
print_r($b);

Результат:

Array
(
    [0] => 5 inch
    [1] => 10 inch
    [2] => 12 inch
    [3] => a
    [4] => b
    [5] => z
)
Array
(
    [3] => 5 inch
    [2] => 10 inch
    [1] => 12 inch
    [0] => a
    [5] => b
    [4] => z
)
person Ilia Kondrashov    schedule 05.10.2020
comment
С помощью strnatcmp порядок был изменен на: 12, 9, 10, 6, 8... Мне нужно: 6,8,9,10,12, A...Z - person XTRUST.ORG; 05.10.2020
comment
@XTRUST.ORG позвольте мне поделиться примером кода, возможно, я неправильно понял задачу: tehplayground.com/iecbsEk2XpaVdhpI - person Ilia Kondrashov; 05.10.2020
comment
Это работает! Спасибо! - person XTRUST.ORG; 05.10.2020

Используйте natsort():

Увидеть как это работает:

// input
$array = [
    '8 Inch', 
    '6 Inch', 
    '12 Inch',
    '10 Inch', 
    'Athletic', 
    'Western',
    '9 Inch'
];

natsort($array);


// output 
Array
(
    [1] => 6 Inch
    [0] => 8 Inch
    [6] => 9 Inch
    [3] => 10 Inch
    [2] => 12 Inch
    [4] => Athletic
    [5] => Western
)

См. демонстрацию

person B001ᛦ    schedule 05.10.2020