简体   繁体   中英

Popping the key & value from an associative array in PHP

Let S be an associative array in PHP, I need to retrieve and extract from it the first element, both the value and the key.

I would use

value1=array_pop(S);

but it only gives me the value.

I can use

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

but it is complicated because it requires to have two copies of the same data. WHich is a confusing since the array is itself an element in an array of arrays. There must be a more elegant way to just read the couple key/value while extracting it.

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

(in that order)

See reset() PHP Manual , key() PHP Manual .

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

However array_pop() PHP Manual is working with the last element:

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

See end() PHP Manual .

For the fun:

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

or

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

or

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

or whatever style of play you like;)

Dealing with empty arrays

It was missing so far to deal with empty arrays. So it's a need to check if there is a last (first) element and if not, set the $key to null (as null can not be an array key):

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

This will give for a filled array like $arr = array('first' => '1st', 'last' => '2nd.'); :

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

And an empty array:

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

Afraid of using unset?

In case you don't trust unset() having the performance you need (of which I don't think it's really an issue, albeit I haven't run any metrics), you can use the native array_pop() implementation as well (but I really think that unset() as a language construct might be even faster):

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 just beat me to it:-)

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

Of course you can split the first statement into two separate.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM