2017-01-02 2 views
0

Я столкнулся с проблемой, мне нужно нормализовать/отсортировать в натуральном порядке значения в массиве после удаления какого-либо элемента.Нормализовать значения массива в натуральном порядке 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

Пожалуйста, смотрите мой пример выше с реальным случае слово.

ответ

0

Если вам нужно использовать собственный алгоритм сортировки, используйте для этого usort. Из PhP документация:

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

Таким образом, вам просто нужно предоставить эти целые числа, если вы на тот случай, если элемент «больше» или «ниже», и usort выполнит эту работу за вас.

В вашем случае, это может привести к этой функции:

<?php 
    function sort_items_map($a, $b) 
    { 
     $value = 0; 

     if($a < $b) 
     { 
      $value = -1; 
     } 
     else if($a > $b) 
     { 
      $value = 1; 
     } 
     else if($a == $b) 
     { 
      $value = 0; 
     } 

     return $value; 
    } 

    $items_map = [1, 3, 1, 7]; // or fill it with your own values 

    usort($items_map, "sort_items_map"); 
?> 
+0

Спасибо за ответ, но ваш код делает только сортировку, мне нужны вещи, чтобы быть в естественном порядке, смотрите мое редактирование. – Putinhello

Смежные вопросы