web-dev-qa-db-ja.com

PHPで連想配列の最初のキーを返します

array_keys()などを介して一時変数を作成せずに、参照で渡すために、連想配列の最初のキーを取得しようとしています。残念ながら、reset()array_shift()は両方とも参照によって配列引数を取るため、どちらも実行可能な結果ではないようです。

PHP 5.4私は天国にいる; array_keys($array)[0];だが、残念ながらこれはもちろん選択肢でもない。

目的を果たす関数を作成することはできましたが、PHPの_array_*_関数の組み合わせがあり、単一のステートメントで目的の結果を生成することしか想像できませんと。

そう:

_$array = array('foo' => 'bar', 'hello' => 'world');

$firstKey = assorted_functions($array); // $firstKey = 'foo'
_

私の質問の「参照なし」句の理由は、参照で渡す方法がある場合は、array_keys()が必要だと思うという事実のためだけです(火を消す

key()を使用しますが、この操作の時点でポインターがどこにあるかわからないため、reset()が必要です。


補遺

私は最近行った認識をフォローアップしています:コメントで述べたように、それはすべて同じようにメモリを使用するので、それが懸念される場合、この質問には解決策がありません。

_$a = range(0,99999);
var_dump(memory_get_peak_usage()); // int(8644416)
$k = array_keys($a)[0];
var_dump(memory_get_peak_usage()); // int(17168824)
_

Iknewこれは、PHPにはそのような最適化機能はありませんが、明示的に言及する必要があると考えました。

ただし、受け入れられた答えの簡潔さはニースであり、サイズの配列サイズの配列を使用している場合に機能します。

36
Dan Lugg

array_shift(array_keys($array));は機能しますが、current(array_keys($array));は内部ポインターを進めないので高速です。

どちらでも動作します。

更新

@TomcatExodusが述べたように、array_shift();は参照によって渡される配列を期待するため、最初の例はエラーを発行します。 current();に固執することをお勧めします

63
adlawson

reset および key を使用できます。

reset( $array );
$first_key = key( $array );

または、次の関数を使用できます。

function firstIndex($a) { foreach ($a as $k => $v) return $k; }
$key = firstIndex( $array );
18
Brian Graham
array_shift(array_keys($array))
1
RiaD

each() それでも一時的に必要ですが、潜在的にarray_keys()を使用するよりもはるかに小さいオーバーヘッドです。

1
Orbling

Array_slice(連想配列のarray_keysと組み合わせて)の使用はどうですか?

$a = range(0,999999);
var_dump(memory_get_peak_usage());
$k = array_keys(array_slice($a, 0, 1, TRUE))[0];
var_dump(memory_get_peak_usage());
var_dump($k);
$k = array_keys($a)[0];
var_dump(memory_get_peak_usage());

出力として提供します(少なくとも私には):

int(36354360)
int(36355112)
int(0)
int(72006024)
int(0)
0
PrinsEdje80