循环移位关联数组?

3
在PHP中工作时,假设您有一个关联数组:
'Monday' => 'mon'
'Tuesday' => 'tue'
'Wednesday' => 'wed'
'Thursday' => 'thur'
'Friday' => 'fri'
'Saturday' => 'sat'
'Sunday' => 'sun'

如何进行“循环”数组移位呢?比如将数组从周三开始,顺序经过所有七天,最后以周二结束?

重要提示:我需要通过关键字来执行此操作,因为我有其他代码决定了移位需要从哪一天开始。


您的意思是将值进行移位,然后将其推回数组的末尾吗? - bfavaretto
基本上,在我的例子中,删除星期一和星期二,并将它们推到数组的末尾就可以达到目标。 - Benjamin Allison
6个回答

4
无需循环
 $arr=array('Monday' => 'mon',
'Tuesday' => 'tue',
'Wednesday' => 'wed',
'Thursday' => 'thur',
'Friday' => 'fri',
'Saturday' => 'sat',
'Sunday' => 'sun');
//say your start is wednesday
$key = array_search("Wednesday",array_keys($arr));
$output1 = array_slice($arr, $key); 
$output2 = array_slice($arr, 0,$key); 
$new=array_merge($output1,$output2);
print_r($new);

1
这个答案很棒,因为它节省了一个循环,而且我可以运行数学计算。如果我想要星期二,但是我得到的键是星期三,我只需要从键中减去1即可。 - Benjamin Allison

3
function curcle_shift($arr, $n) {
  return array_slice($arr, $n % 7) + array_slice($arr, 0, $n % 7);
}

// ex. shift the first 2.
var_dump(curcle_shift($arr, 2));

是的,这个函数正在删除值。 - Ninj

1

在保持数组键的情况下移动数组:

function shiftArray($arr, $key) {
    foreach ($arr as $k => $v) {
        if ($k == $key) break;
        unset($arr[$k]);
        $arr[$k] = $v;
    }
    return $arr;
}

print_r(shiftArray($arr, 'Wednesday'));
/*
Array
(
    [Wednesday] => wed
    [Thursday] => thur
    [Friday] => fri
    [Saturday] => sat
    [Sunday] => sun
    [Monday] => mon
    [Tuesday] => tue
)
 */

抱歉,我应该明确一下。我需要按键来做。它不总是在同一个位置。 - Benjamin Allison
如果您的键不是按正确顺序排列的,则需要一个第二个数字索引数组,其中包含您想要的键的顺序。然后,您应该在这个第二个数组上执行位移和推送操作。另外,$arr[] = array_shift($arr);比使用array_push()稍微好一些。 - Okonomiyaki3000
运行起来像梦一样顺畅。不错! - Benjamin Allison

1
$key = array_keys($arr)[0]; // use a temporary variable in PHP before 5.4
$val = $arr[$key];
unset($arr[$key]);
$arr[$key] = $val;

这将获取第一个键,保存其值,从数组中删除它,然后再次添加它(这将把它放在数组的末尾)。


1

切片、合并、引用处理。

function shiftArray( &$a, $k ) {
    $k = array_search( $k, array_keys( $a ) );
    $a = array_merge( array_slice( $a, $k ), array_slice( $a, 0, $k ) );
}

shiftArray( $week, "Wednesday" );

由于这是通过引用工作的,$week 本身已被重构。没有新数组。

演示:http://codepad.org/uITGdMKy


0
while (key($arr) !== $pivotKey) {
    list($k, $v) = each($arr);
    unset($arr[$k]);
    $arr[$k] = $v;
}

在进入循环之前,请确保该键存在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接