連想配列の最初のキーを決定するための最良の方法は何ですか?私が最初に考えたのは、単に配列を見越してからすぐに壊すことです。
foreach ($an_array as $key => $val) break;
したがって、$ keyに最初のキーが含まれるようにしますが、これは非効率的です。誰かがより良い解決策を持っていますか?
PHP 7.3 から始まる、内部ポインタをリセットせずに指定された配列から最初のキーを取得するarray_key_first()
と呼ばれる新しい組み込み関数があります。詳細については ドキュメント をチェックしてください。
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)
array_keys
はキーの配列を返します。最初のエントリーをください。代わりに、配列上でreset
を呼び出し、続いてkey
を呼び出すこともできます。後者の方法はおそらく少し速いですが(テストしていないので)、内部ポインタをリセットするという副作用があります。
おもしろいことに、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
key($an_array)
はあなたに最初のキーを与えるでしょう
ブリックスごとの編集:配列の先頭にポインタをリセットするには、reset($array);
の前にkey($an_array)
を呼び出す必要があります。
あなたが試すことができます
array_keys($data)[0]
list($firstKey) = array_keys($yourArray);
効率性がそれほど重要ではない場合は、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
2018+の場合
PHP 7.3からはじめて、これを実現するarray_key_first()
関数があります。
$array = ['foo' => 'lorem', 'bar' => 'ipsum'];
$firstKey = array_key_first($array); // 'foo'
ドキュメントは利用可能です ここ 。 ????
$myArray = array(
2 => '3th element',
4 => 'first element',
1 => 'second element',
3 => '4th element'
);
echo min(array_keys($myArray)); // return 1
以下を見つけてください。
$yourArray = array('first_key'=> 'First', 2, 3, 4, 5);
$keys = array_keys($yourArray);
echo "Key = ".$keys[0];
これも解決策になるかもしれません。
$yourArray = array('first_key'=> 'First', 2, 3, 4, 5);
$first_key = current(array_flip($yourArray));
echo $first_key;
私はそれをテストしました、そしてそれはうまくいきます。
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秒でした)。
私にとってうまくいった最善の方法は、
array_shift(array_keys($array))
array_keys
は初期配列からキーの配列を取得し、それからarray_shift
が最初の要素値から切り取ります。これにはPHP 5.4以降が必要です。
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');
list($first_key) = each($arr);
print $first_key;
// key1
php73:
$array = ['a' => '..', 'b' => '..'];
array_key_first($array); // 'a'
array_key_last($array); // 'b';
これは私が今まで見つけたより簡単な方法です。高速でたった2行のコード:-D
$keys = array_keys($array);
echo $array[$keys[0]];
今日、私はPOSTリクエストによって返された私の配列の最初のキーを検索しなければなりませんでした。 (そして、フォームIDなどの番号に注意してください)
PHP の連想配列の最初のキーを返す
私はこれをやった、そしてそれはうまくいく。
$data = $request->request->all();
dump($data);
while ($test = current($data)) {
dump($test);
echo key($data).'<br />';die();
break;
}
たぶんそれは他の男の15分のエコになります。 CYA。
ワンライナー:
$array = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');
echo key( array_slice( $array, 0, 1, true ) );
# echos 'key1'