旋转关联数组,使其以指定的键开头


Rotate an associative array so that it begins with a nominated key

我正在使用一个数组,我需要操作该数组来维护密钥。不幸的是,我需要实现的 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 元素的键不是原始键。您建议提取数组的第一个元素以保持键不变的替代解决方案是什么?

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

$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;
}
}

试试这个 - 对我有用。

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

代码:(演示)

$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(),直到遇到找到的键。

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