从PHP中的关联数组中弹出键和值

Pie*_*oni 22 php associative-array

设S是PHP中的关联数组,我需要从中检索并提取第一个元素,包括值和键.

我会用

value1=array_pop(S);
Run Code Online (Sandbox Code Playgroud)

但它只给了我价值.

我可以用

K=array_keys(S);
key1=array_pop(K);
value1=array_pop(S);
Run Code Online (Sandbox Code Playgroud)

但它很复杂,因为它需要有两份相同的数据.由于数组本身是数组数组中的元素,因此令人困惑.在提取它时,必须有一种更优雅的方式来读取这对键/值.

hak*_*kre 37

$value = reset($arr);
$key = key($arr);
Run Code Online (Sandbox Code Playgroud)

(以该顺序)

请参阅reset()PHP手册, key()PHP手册.

unset($arr[$key]); # in case you want to remove it.
Run Code Online (Sandbox Code Playgroud)

array_pop()PHP手册正在使用最后一个元素:

$value = end($arr);
$key = key($arr);
unset($arr[$key]); # in case you want to remove it.
Run Code Online (Sandbox Code Playgroud)

请参阅end()PHP手册.

为了好玩:

list($value, $key) = array(end($arr), key($arr));
Run Code Online (Sandbox Code Playgroud)

要么

extract(array('value'=>end($arr), 'key'=>key($arr)));
Run Code Online (Sandbox Code Playgroud)

要么

end($arr);
list($key, $value) = each($arr);
Run Code Online (Sandbox Code Playgroud)

或者你喜欢什么样的游戏;)

处理空数组

到目前为止,它缺少处理空数组.因此需要检查是否存在最后(第一个)元素,如果没有,则设置$keynull(因为null不能是数组键):

for($key=null;$key===null&&false!==$value=end($arr);)
    unset($arr[$key=key($arr)]);
Run Code Online (Sandbox Code Playgroud)

这将给出一个填充数组,如$arr = array('first' => '1st', 'last' => '2nd.');:

string(4) "2nd." # value
string(4) "last" # key
array(1) { # leftover array
  ["first"]=>
  string(3) "1st"
}
Run Code Online (Sandbox Code Playgroud)

还有一个空数组:

bool(false) # value
NULL # key
array(0) { # leftover array
}
Run Code Online (Sandbox Code Playgroud)

害怕使用未设置?

如果你不相信unset()有你需要(这我不认为这是一个真正的问题,虽然我还没有运行任何指标)的性能,您可以使用本机array_pop()实施,以及(但我真的认为unset()作为语言结构可能更快):

end($arr);
$key = key($arr);
$value = array_pop($arr);
Run Code Online (Sandbox Code Playgroud)

  • PHP 中的数组是一个散列。这是一个查找操作,而不是整个数组的搜索,而且速度很快。 (2认同)

San*_*hal 6

$value = reset($array);
$key = key($array);
Run Code Online (Sandbox Code Playgroud)

编辑:Hakre 击败了我 :-)


OZ_*_*OZ_ 6

array_slice

$arr = array('k1' => 'v1', 'k2' => 'v2', 'k3' => 'v3');

$a = array_slice($arr, 0, 1);
var_dump($a);

$arr = array_slice($arr, 1);
var_dump($arr);


array(1) {
  ["k1"]=>
  string(2) "v1"
}
array(2) {
  ["k2"]=>
  string(2) "v2"
  ["k3"]=>
  string(2) "v3"
}
Run Code Online (Sandbox Code Playgroud)