我想基于值的开始对数组元素进行排序或重新排序。
我的数组:
[
0 => 'Sun',
1 => 'Mon',
2 => 'Tue',
3 => 'Wed',
4 => 'Thu',
5 => 'Fri',
6 => 'Sat'
]
$ startOn = 3;
预期输出:
[
3 => 'Wed',
4 => 'Thu',
5 => 'Fri',
6 => 'Sat',
0 => 'Sun',
1 => 'Mon',
2 => 'Tue',
]
我尝试使用uksort
,但没有返回预期的输出。
uksort($weekDays, function ($a, $b) use ($startOn) {
return $startOn-$a;
});
当前输出:
[
3 => 'Wed'
4 => 'Thu'
5 => 'Fri'
6 => 'Sat'
2 => 'Tue'
1 => 'Mon'
0 => 'Sun'
]
答案 0 :(得分:1)
您可以使用foreach
$start = 3;
$r1 = $r2 = [];
foreach($a as $k => $v){
($k >= $start) ? ($r1[$k]=$v) : ($r2[$k]=$v);
}
$r = $r1 + $r2;
print_r($r);
工作示例:-https://3v4l.org/1KDoR
答案 1 :(得分:1)
由于array_slice()
代码已从其他答案中删除,因此我想在此处添加我的版本。
主要是将第四个参数设置为true
,以便保留键...
$weekDays = array_slice($weekDays, $startOn, null, true)
+ array_slice($weekDays, 0, $startOn, true);
答案 2 :(得分:1)
使用uksort
,检查Demo
$startOn = 3;
uksort($array,function($a,$b)use($startOn){return ($a + 7 - $startOn) % 7 - ($b + 7 - $startOn) % 7;});
print_r($array);
答案 3 :(得分:1)
这是可行的解决方案,
$k = array_search(3, array_keys($arr));
$arr = array_slice($arr,$k,null,true) + array_slice($arr,0,$k,true);
print_r($arr);
Demo。
输出:-
Array
(
[3] => Wed
[4] => Thu
[5] => Fri
[6] => Sat
[0] => Sun
[1] => Mon
[2] => Tue
)
array_search —在数组中搜索给定值,如果成功,则返回第一个对应的键
array_slice —提取数组的一部分
注意:
array_slice()将重新排序并按以下方式重置整数数组索引 默认。可以通过将prepare_keys设置为来更改此行为 TRUE 。不管此参数如何,始终保留字符串键。