【问题标题】:Circularly shifting associative array?循环移位关联数组?
【发布时间】:2012-05-31 02:35:54
【问题描述】:

在 PHP 中工作,假设您有一个关联数组:

'Monday' => 'mon'
'Tuesday' => 'tue'
'Wednesday' => 'wed'
'Thursday' => 'thur'
'Friday' => 'fri'
'Saturday' => 'sat'
'Sunday' => 'sun'

如何执行“循环”数组移位?说要转移一些事情,使数组从星期三开始,一直持续到所有 7 天,以星期二结束?

重要说明:我需要按键执行此操作,因为我有其他代码确定轮班需要从哪一天开始。

【问题讨论】:

  • 你的意思是移动然后将值推回数组的末尾吗?
  • 基本上。在我的示例中,删除星期一和星期二,并推送到数组的末尾即可实现目标。

标签: php associative-array


【解决方案1】:

不需要循环

 $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。
【解决方案2】:
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));

【讨论】:

  • 是的,这个函数正在删除值
【解决方案3】:
$key = array_keys($arr)[0]; // use a temporary variable in PHP before 5.4
$val = $arr[$key];
unset($arr[$key]);
$arr[$key] = $val;

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

【讨论】:

    【解决方案4】:

    在保持数组键的同时移动数组:

    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
    )
     */
    

    【讨论】:

    • 对不起,我应该指定的。我需要用钥匙来做。它不会总是在同一个地方。
    • 如果您的键顺序不正确,您将需要第二个数字索引数组,其中包含按您想要的顺序排列的键。然后,您应该执行轮班并推动第二个阵列。此外,$arr[] = array_shift($arr); 比使用 array_push() 略好
    • 工作就像一个制造梦想。不错!
    【解决方案5】:

    切片、合并、引用处理。

    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

    【讨论】:

      【解决方案6】:
      while (key($arr) !== $pivotKey) {
          list($k, $v) = each($arr);
          unset($arr[$k]);
          $arr[$k] = $v;
      }
      

      在进入循环之前确保密钥存在。

      【讨论】:

        猜你喜欢
        • 2019-03-07
        • 1970-01-01
        • 2014-02-16
        • 2013-07-05
        • 1970-01-01
        • 1970-01-01
        • 2012-06-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多