連想PHP配列から最初の項目を取得する方法は?


146

次のような配列がある場合:

$array['foo'] = 400;
$array['bar'] = 'xyz';

そして、そのキーを知らずにその配列から最初の項目を取得したかったのですが、どうすればよいでしょうか?これに機能はありますか?


(参照) 配列配列関数
Gordon

回答:


288

reset() 配列内に要素がある場合、配列の最初の値が得られます。

$value = reset($array);

またFALSE、配列が空の場合にも使用できます。


注:$arr = array(/* stuff */); $val = $arr? reset($arr): /* value to indicate array is empty */;
cwallenpoole '06 / 06/06


キーと値を取得したい場合はどうなりますか?
ティンバーマン

51

PHP <7.3

配列について十分に理解していない場合(最初のキーがfoobar かわからない場合)、配列もおそらく空である可能性があります

したがって、特に戻り値がブール値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

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];
}

@AhmedShefeerよく、他の答えは受け入れられたものだけでなく、さらに8年間存在しています。私はここでパン粉を拾うようなものです:-D。しかし、信頼の投票に感謝します!
LSerni

1
キーと値の両方を提供する他の非推奨されていないものは中止されたforeachループであり、扱いにくいので、これが最良の答えであるように思えます。他の答えは、キーなしで値のみを与えます。
sootsnoot 2018年

1
このans、モダンなアプローチを愛し、時間とともに更新されました。
sanjeet bisht

@LSerniあなたがまだアクティブかどうかはわかりませんが、私は行き詰まっていて、このよく説明され、更新された投稿が私を救いました。ありがとう
izk

@izk私はいつもアクティブです!:-D
LSerni

44

最初の反復で壊れる偽のループ:

$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";

2
おそらくreset()の方が簡単だからです。
mjs 2009年

1
ソリューションはコードの最初の行にありますが、完全に不要な別の行を書き続けているためです。
マーカス2011

21
リセットしてもキーが返されない
HarryFink 2013

3
「偽のループ」の場合は+1。各要素を通過せずに、最初の要素のキーと値を取得する必要がありました。このreset()関数は最初の値のみを取得します。
Phil Cross

2
偽のループの場合も+1、キーを保持する必要があるため、リセットはオプションではありませんでした
isJustMe

25

いくつかのオプションがあります。array_shift()最初の要素を返しますが、配列から最初の要素も削除します。

$first = array_shift($array);

current() 内部メモリポインタが指す配列の値を返します。これはデフォルトで最初の要素です。

$first = current($array);

それが最初の要素を指していることを確認したい場合は、いつでも使用できますreset()

reset($array);
$first = current($array);

3
私はこの回答を最も完全なものとして気に入っていreset()ますが、実際には要素を返すことに注意してください$first = current($array)
トムオージェ2013

9

ちょうど他のいくつかのオプションがあるように: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))];、配列が実際に空の場合に警告が発生することです。


非常に記述的な答えであり、それは他の人にとって多くのことを意味します。ありがとう。
Jigar7521

7

array_valuesを使用する別の簡単な方法

array_values($array)[0]

reset()配列が空の場合にfalseを返すため、はるかに優れたオプションです。あなたの解決策は例えば質問では機能しません
Northys '20

1
このようなPHP 7+何かがうまくいくには:array_values($array)[0] ?? FALSE
MarthyM

4

最初の要素を取得する前に、変数が配列かどうかをテストします。配列を動的に作成するときにnullに設定すると、エラーが発生します。

例えば:

if(is_array($array))
{
  reset($array);
  $first = key($array);
}

3

我々はできる $first = reset($array);

の代わりに

reset($array);
$first = current($array);

なので reset()

リセット後の配列の最初の要素を返します。


2

あなたは作ることができます:

$values = array_values($array);
echo $values[0];

2

このようにキーを知らなくても、reset()関数を使用してその配列から最初の項目を取得します。

$value = array('foo' => 400, 'bar' => 'xyz');
echo reset($value);

出力// 400


2

これを試すことができます。

配列の最初の値を取得するには:-

<?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));
?>


1

最初と最後の値を取得するためにこれを行います。これは、より多くの値でも機能します。

$a = array(
    'foo' => 400,
    'bar' => 'xyz',
);
$first = current($a);   //400
$last = end($a);    //xyz

これは、内部ポインタが最初の要素にある場合にのみ機能します。これはポインタの位置をリセットしないので良い方法ですが、ポインタがすでに静止している場合にのみ機能します。
cjc 2018年

1

以降ではPHP 7.3.0には、内部ポインタをリセットせずに行うことが可能です。使用しますarray_key_first。配列に値が含まれていることが確実な場合は、次のようにすることができます。

$first = $array[array_key_first($array)];

多くの場合、配列が空の場合を処理する必要があります。

$first = (empty($array)) ? $default : $array[array_key_first($array)];

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.