【问题标题】:Rotate an associative array so that it begins with a nominated key旋转关联数组,使其以指定键开头
【发布时间】:2014-11-16 18:50:43
【问题描述】:

我正在使用一个数组,我需要操纵它来维护密钥。不幸的是,我需要实现的array_shift() 函数不维护数组的已处理元素的键。请看下面的示例代码:

$rotor = array ("A" => "R", "B" => "D", "C" => "O", "D" => "B");

$position = "C";

foreach ($rotor as $key => $value) {
    if ($key != $position) {
        $temp = array_shift($rotor);
        array_push($rotor, $temp);
    } else {
        break;
    }
}
var_dump($rotor);

结果

array(4) {
 ["C"]=>
 string(1) "O"
 ["D"]=>
 string(1) "B"
 [0]=>
 string(1) "R"
 [1]=>
 string(1) "D"
}

如您所见,RD 元素的键不是原来的键。您推荐什么替代解决方案来提取数组的第一个元素并保持键不变?

P.S:我的目标是提取数组的第一个元素(保留键),如果它不等于变量$position,则将元素本身插入数组的最后一个位置,始终保持其键.

【问题讨论】:

    标签: php arrays rotation key shift


    【解决方案1】:
    $rotor = array ("A" => "R", "B" => "D", "C" => "O", "D" => "B");
    $position = "C";
    
    foreach ($rotor as $key => $value) {
    if($key != $position) {
        array_shift($rotor);
        $rotor += array($key=>$value);
    } else {
        break;
    }
    }
    

    试试这个 - 对我有用。

    【讨论】:

    • 感谢您的回复!但是,使用您的解决方案意味着键和值的分离。最后我需要将它们放回数组的末尾,保持它们是键。
    • 您可以将它们分开放置,也可以将它们放在其他数组中。坦率地说,我不明白你想要做什么,所以这是我得到那把钥匙的最简单方法。
    • 我的目标是提取数组的第一个元素(保留key),如果它不等价于变量$position,则将元素本身插入数组的最后一个位置始终保持它的关键。
    【解决方案2】:

    另一种技术可能会根据数据量和新起始元素的位置而表现得更好或更差,它涉及从数组中分割后半部分并将原始数组替换到末尾。这有效地将较早出现的键放在数组的后面。

    代码:(Demo)

    $rotor = ["A" => "R", "B" => "D", "C" => "O", "D" => "B"];
    $from = "C";
    
    foreach (array_keys($rotor) as $index => $key) {
        if ($key === $from) {
            $rotor = array_slice($rotor, $index, null, true) + $rotor;
            break;
        }
    }
    var_export($rotor);
    

    输出:

    array (
      'C' => 'O',
      'D' => 'B',
      'A' => 'R',
      'B' => 'D',
    )
    

    这只会在循环中调用 1 个函数,而不是一遍又一遍地调用 array_shift(),直到遇到所寻找的键。

    即使寻找的键在第一个元素中或根本不出现在数组中,这种技术也是安全/可靠的。

    【讨论】:

      猜你喜欢
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      • 1970-01-01
      • 2012-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多