次のような配列がある場合:
$array['foo'] = 400;
$array['bar'] = 'xyz';
そして、そのキーを知らずにその配列から最初の項目を取得したかったのですが、どうすればよいでしょうか?これに機能はありますか?
次のような配列がある場合:
$array['foo'] = 400;
$array['bar'] = 'xyz';
そして、そのキーを知らずにその配列から最初の項目を取得したかったのですが、どうすればよいでしょうか?これに機能はありますか?
回答:
$arr = array(/* stuff */); $val = $arr? reset($arr): /* value to indicate array is empty */;
配列について十分に理解していない場合(最初のキーがfooかbar かわからない場合)、配列もおそらく空である可能性があります。
したがって、特に戻り値がブール値FALSEである可能性がある場合は、チェックするのが最善です。
$value = empty($arr) ? $default : reset($arr);
上記のコードは副作用を持っているreset
ため(配列の内部ポインターをリセットします)、配列の最初の要素のコピーにすばやくアクセスするために使用することをお勧めします。array_slice
$value = $default;
foreach(array_slice($arr, 0, 1) as $value);
キーと値の両方を個別に取得したい場合、4番目のパラメーターを次のように追加する必要がありますarray_slice
。
foreach(array_slice($arr, 0, 1, true) as $key => $value);
最初のアイテムをペアとして取得するには(key => value
):
$item = array_slice($arr, 0, 1, true);
最後のアイテム、キー、値を個別に取得するための簡単な変更:
foreach(array_slice($arr, -1, 1, true) as $key => $value);
配列が実際には大きくない場合、実際には必要array_slice
ありません。キー配列全体のコピーを取得してから、最初の項目を取得できます。
$key = count($arr) ? array_keys($arr)[0] : null;
ただし、非常に大きな配列がある場合、への呼び出しにarray_keys
はかなりの時間とメモリが必要になりますarray_slice
(両方の関数が配列をウォークしますが、後者は必要な数の項目(1つ)を収集するとすぐに終了します)。
特筆すべき例外は、非常に大きく複雑なオブジェクトを指す最初のキーがある場合です。その場合array_slice
、最初のラージオブジェクトを複製しますが、array_keys
キーのみを取得します。
PHP 7.3はarray_key_first()
、array_key_last()
ます。これらは、副作用としてアレイの内部状態をリセットすることなく、最初と最後のキーに効率的にアクセスするために明示的に提供されています。
したがって、PHP 7.3では、の最初の値に$array
アクセスできます。
$array[array_key_first($array)];
ただし、配列が空でないことを確認することをお勧めします。そうしないと、エラーが発生します。
$firstKey = array_key_first($array);
if (null === $firstKey) {
$value = "Array is empty"; // An error should be handled here
} else {
$value = $array[$firstKey];
}
最初の反復で壊れる偽のループ:
$key = $value = NULL;
foreach ($array as $key => $value) {
break;
}
echo "$key = $value\n";
またはeach()
(警告: PHP 7.2.0で非推奨)を使用してください:
reset($array);
list($key, $value) = each($array);
echo "$key = $value\n";
reset()
関数は最初の値のみを取得します。
いくつかのオプションがあります。array_shift()
最初の要素を返しますが、配列から最初の要素も削除します。
$first = array_shift($array);
current()
内部メモリポインタが指す配列の値を返します。これはデフォルトで最初の要素です。
$first = current($array);
それが最初の要素を指していることを確認したい場合は、いつでも使用できますreset()
。
reset($array);
$first = current($array);
reset()
ますが、実際には要素を返すことに注意してください$first = current($array)
。
ちょうど他のいくつかのオプションがあるように:reset($arr);
配列ポインターを所定の位置に保持しようとしないのであれば十分であり、非常に大きな配列では、最小限のオーバーヘッドが生じます。とはいえ、それにはいくつかの問題があります:
$arr = array(1,2);
current($arr); // 1
next($arr); // 2
current($arr); // 2
reset($arr); // 1
current($arr); // 1 !This was 2 before! We've changed the array's pointer.
ポインターを変更せずにこれを行う方法:
$arr[reset(array_keys($arr))]; // OR
reset(array_values($arr));
の利点は$arr[reset(array_keys($arr))];
、配列が実際に空の場合に警告が発生することです。
array_valuesを使用する別の簡単な方法
array_values($array)[0]
reset()
配列が空の場合にfalseを返すため、はるかに優れたオプションです。あなたの解決策は例えば質問では機能しません
array_values($array)[0] ?? FALSE
我々はできる
$first = reset($array);
の代わりに
reset($array);
$first = current($array);
なので reset()
リセット後の配列の最初の要素を返します。
このようにキーを知らなくても、reset()関数を使用してその配列から最初の項目を取得します。
$value = array('foo' => 400, 'bar' => 'xyz');
echo reset($value);
出力// 400
これを試すことができます。
配列の最初の値を取得するには:-
<?php
$large_array = array('foo' => 'bar', 'hello' => 'world');
var_dump(current($large_array));
?>
配列の最初のキーを取得するには
<?php
$large_array = array('foo' => 'bar', 'hello' => 'world');
$large_array_keys = array_keys($large_array);
var_dump(array_shift($large_array_keys));
?>