在不破坏其键顺序的情况下对一个数组项进行排序


Order one array item without breaking its key order

我已经看到很多关于这个话题的问题,但我无法解决我的问题。

我正在从数据库中获取一个带有菜单 ID 项的数组,这些项有时可以更新。

我从数据库收到的 id 数组是:

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(6)
  [2]=>
  int(2)
}

我需要 id 2 (int( 移动到关键位置 0 ($sortindex( 而不会破坏数组项目顺序。所以期望的结果将是:

array(3) {
  [0]=>
  int(2)
  [1]=>
  int(1)
  [2]=>
  int(6)
}

为此,我正在尝试使用 usort,但没有成功:

usort($data, function($a, $b) use ($sortindex){
    if ($a == $b) {
        return 0;
    }
    if ($a == $sortindex) {
        return 1;
    }
});

这可能发生在任何其他项目 ID 上。例如,我可以将 id 1 从 0 键位置排序到 2,结果将是:

array(3) {
  [0]=>
  int(6)
  [1]=>
  int(2)
  [2]=>
  int(1)
}
$array = [1, 6, 2];
array_unshift($array, array_pop($array));

或者可能:

$array = [1, 6, 2];
$tmp = array_splice($array, 2, 1);
array_unshift($array, $tmp[0]);

您并不是真的在寻找对值进行排序,您只是想交换索引。
如果要将值插入数组前面以外的其他位置,请使用 array_splice 将其拼接回。

如果你有更多的键需要改变,那么排序可能成为最简单的解决方案:

uksort($array, function ($a, $b) {
    static $keyOrder = [2 => 0, 0 => 1, 1 => 2];
    return $keyOrder[$b] - $keyOrder[$a];
});

也许你正在寻找排序函数