让我们说我有一个像这样的数组:
array(
[0]=>1
[1]=>3
[3]=>5
[15]=>6
);
我个人希望数组[15]成为第一个:
array(
[15]=>6
[0]=>1
[1]=>3
[3]=>5
);
最快,最无痛的方法是什么?
以下是我尝试过的事情:
array_unshift
- 不幸的是,我的密钥是数字的,我需要保持顺序(有点像uasort
)这会弄乱密钥。
uasort
- 看起来太多开销 - 我想让我的元素成为我的数组中第一个的原因是特别避免uasort
! (动态交换元素而不是在需要时进行排序)
答案 0 :(得分:2)
假设您知道要移位的元素的键,并且该元素可以位于数组中的任何位置(不一定是最后一个元素):
$shift_key = 15;
$shift = array($shift_key => $arr[$shift_key]);
$arr = $shift + $arr;
已更新 - unset()
没有必要。由@FuzzyTree指出
答案 1 :(得分:1)
您可以使用this和slice union来尝试operator:
// get last element (preserving keys)
$last = array_slice($array, -1, 1, true);
// put it back with union operator
$array = $last + $array;
更新: as mentioned below,此答案采用最后一个密钥并将其置于最前面。如果你想任意移动任何元素到前面:
$array = array($your_desired_key => $array[$your_desired_key]) + $array;
联盟操作员从右侧开始并向左添加(因此原始值会被覆盖)。
答案 2 :(得分:-2)
如果#15总是最后一次你可以
$last = array_pop($array); //remove from end
array_unshift($last); //push on front
要重新排序按键进行排序,只需添加
即可$array = array_values($array); //reindex array
@Edit - 如果我们不假设它总是最后那么我会去(如果我们总是知道关键是什么,那么我们很可能知道它的位置或者它不是数字索引数组而是一个关联的数组数字键,因为操作状态“任意”,所以必须假设数组的结构是事先知道的。)
我也没有看到重新索引它们的必要性,因为op声明它是为了避免排序。那你为什么要排序?
$item = $array[15];
unset($array[15]); //....etc.