PHP通过键上的特定开始对数组进行排序/重新排序

时间:2019-09-17 05:24:16

标签: php arrays

我想基于值的开始对数组元素进行排序或重新排序。

我的数组:

[
    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'
]

4 个答案:

答案 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 。不管此参数如何,始终保留字符串键。