@vlaabra

Как отсортировать многомерный ассоциативный массив только по одному значению?

Здравствуйте.

Вот массив:
$test = [
	[
		'date' => '1',
		'message' => 'Первый'
	],
	[
		'date' => '3',
		'message' => '1 Третий'
	],
	[
		'date' => '2',
		'message' => 'Второй'
	],
	[
		'date' => '3',
		'message' => '0 Четвертый'
	],
	[
		'date' => '0',
		'message' => 'Нулевой'
	]
];


Должен стать таким:
$test = [
	[
		'date' => '0',
		'message' => 'Нулевой'
	],
	[
		'date' => '1',
		'message' => 'Первый'
	],
	[
		'date' => '2',
		'message' => 'Второй'
	],
	[
		'date' => '3',
		'message' => '1 Третий'
	],
	[
		'date' => '3',
		'message' => '0 Четвертый'
	]
];


Решение array_multisort($test) сортирует по message в том числе, а это не нужно:
$test = [
	[
		'date' => '0',
		'message' => 'Нулевой'
	],
	[
		'date' => '1',
		'message' => 'Первый'
	],
	[
		'date' => '2',
		'message' => 'Второй'
	],
[
		'date' => '3',
		'message' => '0 Четвертый'
	],
	[
		'date' => '3',
		'message' => '1 Третий'
	]
];


Вот так сортирует правильно, но намного медленнее:
function cmp($a, $b) {
	$a = $a['date'];
	$b = $b['date'];
	if ($a == $b) {
		return 0;
	}
	return ($a < $b) ? -1 : 1;
}
uasort($test, 'cmp');


Решения с перезаписью значений в ключи и обработка через ksort() работают тоже быстро, но теряют массивы с одинаковыми значениями.

Мне бы что-нибудь такое же простое и быстрое, как array_multisort(), но чтобы сортировка была только по одному значение.

Спасибо.
  • Вопрос задан
  • 4019 просмотров
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
uasort достаточно быстр. Только код можно упростить:

uasort($test, function ($a, $b) {
    // если бы у вас там были именно числа...
    // return $a['date'] - $b['date'];
    return strcmp($a['date'], $b['date']);
}
Ответ написан
Ваш ответ на вопрос

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

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