Я столкнулся с проблемой, мне нужно нормализовать/отсортировать в натуральном порядке значения в массиве после удаления какого-либо элемента.Нормализовать значения массива в натуральном порядке PHP
Рассмотрите следующий пример. Начальный массив
{ [313]=> int(2) [303]=> int(1) [295]=> int(3) [290]=> int(4) }
отсортированный массив
{ [303]=> int(1) [313]=> int(2) [295]=> int(3) [290]=> int(4) }
Рассмотрим случай, когда мы удаляем первый элемент, массив должен выглядеть, как это сейчас
{ [313]=> int(1) [295]=> int(2) [290]=> int(3) }
В случае элемента внутри диапазона массива, например, 295
(3) оно должно быть
{ [303]=> int(1) [313]=> int(2) [290]=> int(3) }
Надеюсь, у вас есть идея. Но моя функция не делает это правильно. Я реализовал часть этой сортировки, вот код, но, возможно, есть другие способы сделать это проще?
const MIN_VALUE = 1;
public function sort_items(&$items_map)
{
if (!empty($items_map)) {
asort($items_map);
var_dump($items_map);
$first_item = reset($items_map);
if ($first_item > self::MIN_VALUE) {
$normalize_delta = $first_item - self::MIN_VALUE;
$prev_item_id = null;
foreach ($items_map as $id => $part) {
$items_map[$id] = $part - $normalize_delta;
if (!empty($prev_item_id)) {
$difference = $items_map[$id] - $items_map[$prev_item_id];
if ($difference > 1) {
$items_map[$id] = $items_map[$id] - ($difference - 1);
}
}
$prev_item_id = $id;
}
}
}
return $items_map;
}
Я был бы признателен за любую помощь.
Благодаря
UPDATE
Для уточнения.
Я хочу вещи, чтобы не быть просто сортируются в правильном порядке, но быть в естественном порядке, например
последовательности 1,3,5,6,7,9
должны быть преобразованы в 1,2,3,4,5,6
, но сохраняя keys
то же самое.
2,3,7,9
=>1,2,3,4
Пожалуйста, смотрите мой пример выше с реальным случае слово.
Спасибо за ответ, но ваш код делает только сортировку, мне нужны вещи, чтобы быть в естественном порядке, смотрите мое редактирование. – Putinhello