Я использую следующий код для сортировки значений, используя собственный алгоритм сортировки.
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? Благодарю.
Вот небольшое решение (демонстрация):
$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
, Готово!
У меня была очень похожая проблема сегодня, единственное отличие было в том, что формат чисел был немного другим.
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.