@Otrivin
junior full-stack сисадмин

Сортировка по ключам с дробной частью?

Здравствуйте! Столкнулся с необходимостью отсортировать массив значений по ключу, в ключе - строки с числом с десятичной частью.

Пример:
$arr = [
	'1.2' => '1.2',
	'2' => '2',
	'1' => '1',
	'1.1' => '1.1',	
	'1.10' => '1.10',
	'1.3' => '1.3'
];


Стандартная $ksort() вернёт это:
1, 1.1, 1.10, 1.2, 1.3.....

Есть ли какая-то функция для этого? Не нашел, и пока соорудил свой огород. В общем-то, работает, но хотелось бы знать, если есть уже встроенное решение)

Пример
// исходный массив, сортируем по ключу
$arr = ['1.2' => '1.2', '2' => '2', '1' => '1','1.1' => '1.1', '1.3' => '1.3', '1.10' => '1.10', '1.12' => '1.12', '2.11' => '2.11', '2' => '2', '2.1' => '2.1', '2.2' => '2.2'];
	
function cmp($a, $b){
    // сначала простое сравнение. Если оба равны = возвращаем 0.
    // если не равны, то сначала целые части
    // потом десятичные
    // Если одинаковое целое, но у одного из них нет десятичной части, то без десятичной - меньше.
    // Если десятичные у обоих = сравниваем
	if ($a == $b){
		return 0;
	} else {
		$wholePartA = (integer)($a);
		$wholePartB = (integer)($b);
		
		if ($wholePartA > $wholePartB){
			return 1;
		} else if ($wholePartA < $wholePartB){
			return -1;
		} else {
			if ( (strpos($a, '.') !== false) && (strpos($b, '.') !== false) ){
				$fractA = substr($a, strpos($a,'.')+1);
				$fractB = substr($b, strpos($b,'.')+1);
				if ($fractA > $fractB){
					return 1;
				} else {
					return -1;
				}
			} else {
				if (strpos($a, '.') === false){
					return -1;
				} else if (strpos($b, '.') === false){
					return 1;
				}
			}
		}
	}
}
uksort($arr, "cmp"); // пользовательская сортировка

Песочница
  • Вопрос задан
  • 100 просмотров
Решения вопроса 2
@zhaar
Умножь свое число на 10/100/1000 и сортируй как обычно
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
У вас в ключе не числа, а строки.
uksort($arr, function ($a, $b) { return +$a <=> +$b; });
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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