web-dev-qa-db-ja.com

PHPの連想配列からキーと値をポップする

SをPHPの連想配列とすると、最初の要素(値とキーの両方)を取得して抽出する必要があります。

私は使うだろう

value1=array_pop(S);

しかし、それは私に価値を与えるだけです。

私は使えます

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

ただし、同じデータの2つのコピーが必要になるため、複雑になります。配列自体が配列の配列の要素であるため、WHichは混乱を招きます。抽出中にカップルのキー/値を読み取るよりエレガントな方法が必要です。

23
Pietro Speroni
_$value = reset($arr);
$key = key($arr);
_

(この順序で)

reset()PHPマニュアルkey()PHPマニュアル

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

ただしarray_pop()PHPマニュアル は最後の要素を処理しています:

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

end()PHPマニュアル

楽しみのために:

_list($value, $key) = array(end($arr), key($arr));
_

または

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

または

_end($arr);
list($key, $value) = each($arr);
_

またはあなたが好きな遊びのどんなスタイル;)

空の配列を扱う

これまで、空の配列を処理するために欠けていました。したがって、最後の(最初の)要素があるかどうかを確認する必要があります。ない場合は、_$key_をnullに設定します(nullは配列キーにできないため)。

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

これは$arr = array('first' => '1st', 'last' => '2nd.');のような塗りつぶされた配列を提供します:

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

そして空の配列:

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

Unsetの使用を恐れていますか?

unset()が信頼できない場合は、必要なパフォーマンスが得られます(メトリックを実行していませんが、実際には問題ないと思います)。ネイティブのarray_pop()実装も(ただし、言語構造としてのunset()の方がはるかに高速であると私は本当に思っています):

_end($arr);
$key = key($arr);
$value = array_pop($arr);
_
38
hakre

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

編集:ハクレは私にそれを打ち負かしました:-)

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

もちろん、最初のステートメントを2つに分割できます。

3
KingCrunch