web-dev-qa-db-ja.com

連想配列の最初のキーを取得しますか?

連想配列の最初のキーを決定するための最良の方法は何ですか?私が最初に考えたのは、単に配列を見越してからすぐに壊すことです。

foreach ($an_array as $key => $val) break;

したがって、$ keyに最初のキーが含まれるようにしますが、これは非効率的です。誰かがより良い解決策を持っていますか?

706
Alex S

2019年アップデート

PHP 7.3 から始まる、内部ポインタをリセットせずに指定された配列から最初のキーを取得するarray_key_first()と呼ばれる新しい組み込み関数があります。詳細については ドキュメント をチェックしてください。


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

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

基本的には最初のコードと同じですが、オーバーヘッドが少し少なくなり、何が起こっているのかが明らかになります。

resetを呼び出すことを忘れないでください。そうしないと、配列内の任意のキーを取得できます。最後のキーを取得するためにendの代わりに reset を使うこともできます。

キーに最初の値を取得させたい場合は、resetが実際にそれを返します。

$first_value = reset($array);

ただし、注意が必要なケースが1つあります(最初に配列の長さを確認してください)。

$arr1 = array(false);
$arr2 = array();
var_dump(reset($arr1) === reset($arr2)); // bool(true)
1252
Blixt

array_keysはキーの配列を返します。最初のエントリーをください。代わりに、配列上でresetを呼び出し、続いてkeyを呼び出すこともできます。後者の方法はおそらく少し速いですが(テストしていないので)、内部ポインタをリセットするという副作用があります。

73
troelskn

おもしろいことに、foreachループは実際にこれを行うための最も効率的な方法です。

OPは効率性について具体的に質問したので、現在のすべての答えは実際にはforeachよりはるかに効率が悪いことを指摘しておくべきです。

私はphp 5.4でこれについてベンチマークをしました、そしてリセット/キーポインタメソッド(受け入れられた答え)はforeachよりも約7倍遅いようです。配列全体を操作する他の方法(array_keys、array_flip)は明らかにそれよりもさらに遅くなり、大きな配列を扱うときは much 悪化します。

Foreachはまったく非効率的ではありません。気軽に使用してください。

編集2015-03-03:

ベンチマークスクリプトが要求されました、私はオリジナルのものを持っていませんが代わりにいくつかの新しいテストを行いました。今回私はリセット/キーの約2倍の速さでforeachを見つけました。私は100キーの配列を使用して、いくつかの顕著な違いを得るためにそれぞれのメソッドを100万回実行しました。これは簡単なベンチマークのコードです。

$array = [];
for($i=0; $i < 100; $i++)
    $array["key$i"] = $i;

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    foreach ($array as $firstKey => $firstValue) {
        break;
    }
}
echo "foreach to get first key and value: " . (microtime(true) - $start) . " seconds <br />";

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    $firstValue = reset($array);
    $firstKey = key($array);
}
echo "reset+key to get first key and value: " . (microtime(true) - $start) . " seconds <br />";

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    reset($array);
    $firstKey = key($array);
}
echo "reset+key to get first key: " . (microtime(true) - $start) . " seconds <br />";


for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    $firstKey = array_keys($array)[0];
}
echo "array_keys to get first key: " . (microtime(true) - $start) . " seconds <br />";

私のPHP 5.5では、これは出力:

foreach to get first key and value: 0.15501809120178 seconds 
reset+key to get first key and value: 0.29375791549683 seconds 
reset+key to get first key: 0.26421809196472 seconds 
array_keys to get first key: 10.059751987457 seconds

+キーをリセット http://3v4l.org/b4DrN/perf#tabs
foreach http://3v4l.org/gRoGD/perf#tabs

51
Webmut

key($an_array)はあなたに最初のキーを与えるでしょう

ブリックスごとの編集:配列の先頭にポインタをリセットするには、reset($array);の前にkey($an_array)を呼び出す必要があります。

36
jimyi

あなたが試すことができます

array_keys($data)[0]
21
Stopper
list($firstKey) = array_keys($yourArray);
21

効率性がそれほど重要ではない場合は、PHP 5.4以降でarray_keys($yourArray)[0]を使用できます。

例:

# 1
$arr = ["my" => "test", "is" => "best"];    
echo array_keys($arr)[0] . "\r\n"; // prints "my"


# 2
$arr = ["test", "best"];
echo array_keys($arr)[0] . "\r\n"; // prints "0"

# 3
$arr = [1 => "test", 2 => "best"];
echo array_keys($arr)[0] . "\r\n"; // prints "1"

ソリューションに対する利点:

list($firstKey) = array_keys($yourArray);

それはあなたがarray_keys($arr)[0]を関数パラメータとして渡すことができるということです(すなわちdoSomething(array_keys($arr)[0], $otherParameter))。

HTH

20
Martin Vseticka

2018+の場合

PHP 7.3からはじめて、これを実現するarray_key_first()関数があります。

$array = ['foo' => 'lorem', 'bar' => 'ipsum'];
$firstKey = array_key_first($array); // 'foo'

ドキュメントは利用可能です ここ 。 ????

16
Ivan Augusto
$myArray = array(
    2 => '3th element',
    4 => 'first element',
    1 => 'second element',
    3 => '4th element'
);
echo min(array_keys($myArray)); // return 1
12
Hamidreza

以下を見つけてください。

$yourArray = array('first_key'=> 'First', 2, 3, 4, 5);
$keys   =   array_keys($yourArray);
echo "Key = ".$keys[0];

作業例:

11
Pupil

これも解決策になるかもしれません。

$yourArray = array('first_key'=> 'First', 2, 3, 4, 5);
$first_key = current(array_flip($yourArray));
echo $first_key;

私はそれをテストしました、そしてそれはうまくいきます。

作業コード:

9
Pupil

Webmut の解決策を強化するために、以下の解決策を追加しました。

$firstKey = array_keys(array_slice($array, 0, 1, TRUE))[0];

PHP 7.1での私の出力は次のとおりです。

foreach to get first key and value: 0.048566102981567 seconds 
reset+key to get first key and value: 0.11727809906006 seconds 
reset+key to get first key: 0.11707186698914 seconds 
array_keys to get first key: 0.53917098045349 seconds 
array_slice to get first key: 0.2494580745697 seconds 

サイズ10000の配列に対してこれを行うと、結果は次のようになります。

foreach to get first key and value: 0.048488140106201 seconds 
reset+key to get first key and value: 0.12659382820129 seconds 
reset+key to get first key: 0.12248802185059 seconds 
array_slice to get first key: 0.25442600250244 seconds 

Array_keysメソッドは30秒でタイムアウトします(1000要素のみの場合、残りのタイミングはほぼ同じでしたが、array_keysメソッドは約7.5秒でした)。

4
PrinsEdje80

私にとってうまくいった最善の方法は、

array_shift(array_keys($array))

array_keysは初期配列からキーの配列を取得し、それからarray_shiftが最初の要素値から切り取ります。これにはPHP 5.4以降が必要です。

3
 $arr = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');
 list($first_key) = each($arr);
 print $first_key;
 // key1
3
voodoo417

php73:

$array = ['a' => '..', 'b' => '..'];

array_key_first($array); // 'a'
array_key_last($array); // 'b';

http://php.net/manual/en/function.array-key-first.php

2

これは私が今まで見つけたより簡単な方法です。高速でたった2行のコード:-D

$keys = array_keys($array);
echo $array[$keys[0]];
2
Salvi Pascual

今日、私はPOSTリクエストによって返された私の配列の最初のキーを検索しなければなりませんでした。 (そして、フォームIDなどの番号に注意してください)

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

http://php.net/key

私はこれをやった、そしてそれはうまくいく。

    $data = $request->request->all();
    dump($data);
    while ($test = current($data)) {
        dump($test);
        echo key($data).'<br />';die();
        break;
    }

たぶんそれは他の男の15分のエコになります。 CYA。

0
Roupioz Clement

ワンライナー:

$array = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');
echo key( array_slice( $array, 0, 1, true ) );

# echos 'key1'
0
Kohjah Breese