我遇到了这个问题,我需要在删除一些项目之后对数组中的自然顺序值进行规范化/排序。
考虑以下示例。初始数组
{ [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
请参阅上面的示例,并附上真实的案例。
答案 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");
?>