Popping a chave e o valor de uma matriz associativa em PHP

Deixe S ser uma matriz associativa em PHP, eu preciso recuperar e extrair dele o primeiro elemento, tanto o valor quanto a chave.

eu usaria

value1=array_pop(S); 

mas isso só me dá o valor.

Eu posso usar

 K=array_keys(S); key1=array_pop(K); value1=array_pop(S); 

mas é complicado porque exige ter duas cópias dos mesmos dados. O que é confuso, uma vez que a matriz é ela própria um elemento em uma matriz de arrays. Deve haver uma maneira mais elegante de ler a chave / valor de casal ao extraí-la.

 $value = reset($arr); $key = key($arr); 

(naquela ordem)

Veja reset() Manual do PHP , key() Manual do PHP .

 unset($arr[$key]); # in case you want to remove it. 

No entanto, o array_pop() PHP Manual está trabalhando com o último elemento:

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

Ver end() PHP Manual .

Para a diversão:

 list($value, $key) = array(end($arr), key($arr)); 

ou

 extract(array('value'=>end($arr), 'key'=>key($arr))); 

ou

 end($arr); list($key, $value) = each($arr); 

ou qualquer estilo de jogo que você gosta;)

Lidar com arrays vazios

Faltava até agora lidar com arrays vazios. Portanto, é preciso verificar se há um último (primeiro) elemento e, se não, defina a $key como null (como null não pode ser uma chave de matriz):

 for($key=null;$key===null&&false!==$value=end($arr);) unset($arr[$key=key($arr)]); 

Isso dará para uma matriz cheia como $arr = array('first' => '1st', 'last' => '2nd.'); :

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

E uma matriz vazia:

 bool(false) # value NULL # key array(0) { # leftover array } 

Medo de usar desativado?

Caso não confie em unset() com o desempenho que você precisa (do que eu não acho que seja realmente um problema, embora não tenha executado nenhuma métrica), você também pode usar a array_pop() nativa array_pop() ( mas eu realmente acho que unset() como uma construção de idioma pode ser ainda mais rápido):

 end($arr); $key = key($arr); $value = array_pop($arr); 

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" } 
 $value = reset($array); $key = key($array); 

Edit: Hakre apenas me bateu para ele 🙂

 list($value, $key) = array(reset($s), key($s)); array_shift($s); // or just unset($s[$key]); 

Claro que você pode dividir a primeira declaração em duas separadas.