我正在使用一个数组,我需要操作该数组来维护密钥。不幸的是,我需要实现的 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"
}
如您所见,R
和 D
元素的键不是原始键。您建议提取数组的第一个元素以保持键不变的替代解决方案是什么?
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()
,直到遇到找到的键。
即使查找的键位于第一个元素中或根本不出现在数组中,此技术也是安全/可靠的。