2017-01-02 78 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

相关问题