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.
设S是PHP中的关联数组,我需要检索并从中提取第一个元素,包括值和键。
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.
但它很复杂,因为它需要有两份相同的数据。由于数组本身是数组数组中的元素,因此令人困惑。在提取它时,必须有一种更优雅的方式来读取这对键/值。
4 个解决方案
#1
34
$value = reset($arr);
$key = key($arr);
(in that order)
(以该顺序)
See reset()
PHP Manual, key()
PHP Manual.
请参阅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:
但是,array_pop()PHP手册正在使用最后一个元素:
$value = end($arr);
$key = key($arr);
unset($arr[$key]); # in case you want to remove it.
See end()
PHP Manual.
请参阅end()PHP手册。
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):
到目前为止,它缺少处理空数组。因此需要检查是否存在last(first)元素,如果不存在,则将$ key设置为null(因为null不能是数组键):
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.');
:
这将给出一个填充数组,如$ 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):
如果您不相信unset()具有您需要的性能(我认为它不是真正的问题,尽管我没有运行任何指标),您也可以使用本机array_pop()实现(但我真的认为unset()作为语言结构可能会更快):
end($arr);
$key = key($arr);
$value = array_pop($arr);
#2
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"
}
#3
3
$value = reset($array);
$key = key($array);
Edit: Hakre just beat me to it :-)
编辑:哈克只是打败了我:-)
#4
2
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.
当然,您可以将第一个语句拆分为两个单独的语句。
#1
34
$value = reset($arr);
$key = key($arr);
(in that order)
(以该顺序)
See reset()
PHP Manual, key()
PHP Manual.
请参阅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:
但是,array_pop()PHP手册正在使用最后一个元素:
$value = end($arr);
$key = key($arr);
unset($arr[$key]); # in case you want to remove it.
See end()
PHP Manual.
请参阅end()PHP手册。
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):
到目前为止,它缺少处理空数组。因此需要检查是否存在last(first)元素,如果不存在,则将$ key设置为null(因为null不能是数组键):
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.');
:
这将给出一个填充数组,如$ 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):
如果您不相信unset()具有您需要的性能(我认为它不是真正的问题,尽管我没有运行任何指标),您也可以使用本机array_pop()实现(但我真的认为unset()作为语言结构可能会更快):
end($arr);
$key = key($arr);
$value = array_pop($arr);
#2
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"
}
#3
3
$value = reset($array);
$key = key($array);
Edit: Hakre just beat me to it :-)
编辑:哈克只是打败了我:-)
#4
2
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.
当然,您可以将第一个语句拆分为两个单独的语句。