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にはそのような最適化機能はありませんが、明示的に言及する必要があると考えました。
ただし、受け入れられた答えの簡潔さはニースであり、サイズの配列サイズの配列を使用している場合に機能します。
array_shift(array_keys($array));
は機能しますが、current(array_keys($array));
は内部ポインターを進めないので高速です。
どちらでも動作します。
@TomcatExodusが述べたように、array_shift();
は参照によって渡される配列を期待するため、最初の例はエラーを発行します。 current();
に固執することをお勧めします
array_shift(array_keys($array))
each()
それでも一時的に必要ですが、潜在的にarray_keys()
を使用するよりもはるかに小さいオーバーヘッドです。
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)