以自然顺序PHP规范化数组值

时间:2017-01-02 14:59:26

标签: php arrays algorithm sorting dictionary

我遇到了这个问题,我需要在删除一些项目之后对数组中的自然顺序值进行规范化/排序。

考虑以下示例。初始数组

{ [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;
}

如果有任何帮助,我将不胜感激。

由于

更新

澄清。

我希望项目不仅按正确顺序排序,而是按自然顺序排序,例如

序列1,3,5,6,7,9应转换为1,2,3,4,5,6,但保持keys不变。

2,3,7,9 => 1,2,3,4

请参阅上面的示例,并附上真实的案例。

1 个答案:

答案 0 :(得分: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");
?>