Как отсортировать массив значений Imperial (дюймы с дробями)?

Я использую следующий код для сортировки значений, используя собственный алгоритм сортировки.

usort($this->_items, function($a, $b) { return strnatcasecmp($a['label'], $b['label']);});

Но проблема в том, что это неправильно сортирует значения для следующего:

$array=array( '18"', '4"', '18 1/2"', '18 1/4"');

Следует отсортировать значения в следующем порядке

4"18"18 1/4"18 1/2"

Есть ли способ, как я могу получить этот тип сортировки с помощью кода PHP? Благодарю.

1

Решение

Вот небольшое решение (демонстрация):

$array=array('18 1/2"','18"','4"','18 11/12"','18 1/4"');
foreach($array as $k=>$v){
$copy[$k]=preg_match("/(\d+)\/(\d+)/",$v,$m)?$m[1]/$m[2]+(int)$v:(int)$v;
}
array_multisort($copy,SORT_NUMERIC,$array);
var_export($array);

Выход:

array (
0 => '4"',
1 => '18"',
2 => '18 1/4"',
3 => '18 1/2"',
4 => '18 11/12"',
)

foreach() итерацию $array и звонки preg_match () на каждом значении, чтобы генерировать $copy значения массива. Если он содержит конечную дробь, то дробь преобразуется в десятичный формат и добавляется к целому числу, иначе строковое значение преобразуется в целое число.

затем $copy используется array_multisort () Сортировать $array, Готово!

0

Другие решения

У меня была очень похожая проблема сегодня, единственное отличие было в том, что формат чисел был немного другим.

5/8

1-3 / 4

2-13 / 54

54/64

и еще пара сотен в этом стиле мое решение регулярных выражений было

preg_match_all("/(^.*?)-?(\d+)\/(\d+)/",$input,$matches)

главное преимущество перед предоставленным ответом состоит в том, что первая группа захвата всегда будет соответствовать целому числу, и в случаях, когда вам нужно будет предоставить предыдущему регулярному выражению 0 5/8 или 0-5 / 8, вы можете просто позволить регулярному выражению оставьте первую группу захвата пустой. после этого его так же просто, как

$decimalConversion = $matches[2]/$matches[3]+$matches[1]

Если вам интересно узнать о $ match [0], он вернет все совпадения. Также этому регулярному выражению не сопоставляются целые числа, но, поскольку вам действительно не нужно выполнять какие-либо преобразования с ними, пока они остаются в массиве, вы все равно сможете корректно выполнять сортировку.

Также я вытащил в array_msort из http://php.net/manual/en/function.array-multisort.php как более легкая для чтения и использования альтернатива array_multisort

после этого я использовал array_values ​​($ array) для сброса ключей в новую сортировку и передал ключи обратно в magento в качестве sort_order для option_id значения путем прямой записи в таблицу eav_attribute_option.

0

По вопросам рекламы [email protected]