配列の最初の要素を取得する


1071

私は配列を持っています:

array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )

この配列の最初の要素を取得したいと思います。期待される結果:文字列 apple

1つの要件:参照渡しでは実行できないためarray_shift、適切な解決策ではありません。

これどうやってするの?


1
参照によって行うことはできませんか?
2009

関数は&$arrayパラメータとして使用してはいけません。
hsz 2009

4
私はあなたが「実際には」「参照によって行うことはできない」とは、配列がデータベースから動的に返されていることを意味し、最初の要素を取得する前に配列を変数に渡したくないと思うそれから。私が正しいとすれば、以下に提供されているすべてのソリューション(承認された回答を含む)の大部分は不十分です。
cartbeforehorse 2012年

それを取得するか、取得して既存のアレイから削除する必要がありますか?
Jo Smo、2014

配列の基本的な使用については、このリンクtechnofusions.com/introduction-to-arrays-in-php
Vikrant Vir Bhalla

回答:


1367

元の回答ですが、費用がかかります(O(n)):

array_shift(array_values($array));

O(1)の場合:

array_pop(array_reverse($array));

その他のユースケースなど...

(配列ポインタをリセットするという意味で)の変更$arrayが問題にならない場合は、次のように使用できます。

reset($array);

配列の「コピー」が必要な場合、これは理論的にはより効率的です。

array_shift(array_slice($array, 0, 1));

PHP 5.4以降(ただし、空の場合はインデックスエラーが発生する可能性があります):

array_values($array)[0];

77
+1で元の配列がarray_values()で変更されないようにするための賢い回避策
ChrisR

44
これを取得します:<b>厳密な標準</ b>:変数のみを参照渡しする必要があります。素敵な回避策btw
Simone

191
これは少しやりすぎではありませんか?配列に数千の要素が含まれている場合はどうなりますか?最初の要素を取得するためだけにまったく新しい配列を作成することは正当化されますか?list()そしてreset()私の意見に対してはるかに良い解決策です。
マーティンディミトロフ

33
同意する。現在の値をリセットして返す1行と比較して、過剰なリソースと異常なリソースの合計は重いです:
zmonteca 2012

48
-1上記のようにコメンターは言った。これには101の賛成票があるのは、私には不可解です。
オービット

790

マイクが指摘したように(可能な最も簡単な方法):

$arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )
echo reset($arr); // Echoes "apple"

キーを取得したい場合:(リセット後に実行してください)

echo key($arr); // Echoes "4"

PHPのドキュメントから:

混合 リセット(配列&$ array);

説明:

reset()は、配列の内部ポインタを最初の要素に巻き戻し、最初の配列要素の値を返します。配列が空の場合はFALSEを返します。


参照によってリセットに渡されますが、元の配列は変更されません。それがhszが参照渡しを望まない理由だと思います。
Dennis Jamin 2013年

10
配列のイテレータが変更されます。これをforeach件名の配列で行うと、失敗します。
Zenexer 2013年

2
@Zenexerこれは常に(通常)trueとは限りません。通常、実際にforeachは、ループしている配列をコピーします。
Luke Cousins

1
リセット後@Anggerは、あなたが呼び出すことができkey($arr)、あなたは「4」(答えに追加)を取得します
レペ

3
@ZenexerもLuke Cousinsも正しくありません。1)foreachは配列の内部ポインタを使用せず、独自のポインタを作成します。foreach内でresetの呼び出しを確認するのは簡単です-ループは、からの影響なしにその方法に従いますreset()。2)いいえ、foreachは配列のコピーを作成しません!!! それはそれ自身のポインタを作成するだけです(既存のもののコピーでさえありません-確認するのも簡単で、next()foreachの前に呼び出します)。
dmikam

278
$first_value = reset($array); // First element's value
$first_key = key($array); // First element's key

2
実際にはテストしていませんが、このアプローチが最も効率的だと思われます。
mason81 2012

4
問題は、キーではなく値を尋ねる問題だけです。したがって、current($ array)をkey($ array)の代わりに使用する必要があります
zmonteca

4
@zmonteca $ first_value = reset($ array); ここで値を取得し、reset()関数が配列の内部ポインターを巻き戻し、最初の要素を返します。
S3Mi 2012年

1
ベストアンサー!最初の値を取得するためにkey()の同等性を探していました。これは役立ちます!
Alain Tiemblo、2012年

98
$arr = array( 9 => 'apple', 7 => 'orange', 13 => 'plum' );
echo reset($arr); // echoes 'apple'

現在のポインタ位置を失いたくない場合は、配列のエイリアスを作成してください。


1
聞き取れませんでした。どういう意味ですか?最初のキーが他のキーよりも大きいかどうかは問題なく機能します。
yoda

29
+1 FYIはreset()すでに最初の要素を返しているので、使用する必要はありませんcurrent()- echo reset($arr)十分でしょう
Mike

@マイクしかし、あなたは好むかもしれないcurrentreset例えば、参考例で生産PHP通知/エラーを回避するためcurrent(array_filter(...));で3v4l
CPHPython 2018

91

current($array)PHPマニュアルによると、配列の最初の要素を取得できます。

すべての配列には、その「現在の」要素への内部ポインタがあり、配列に挿入された最初の要素に初期化されます。

したがって、配列ポインタを再配置するまで機能します。それ以外の場合は、配列をリセットする必要があります。


4
これがかなり簡単かつ正確に質問に回答するため、これがなぜ受け入れられた回答ではなかったのかはわかりません。
14

26
current($array)配列ポインタが「現在」最初の要素を指している場合にのみ機能しますreset($array)。それ以外の場合は必要です。
Jon

6
current()PHPのドキュメントにはこれが反映されていませんが、参照は必要なくなったようです。したがって、これが最良の解決策になったと思います。
ライアン

@ライアンは同意しましたが、このソリューションは2014年の2年前にこの同じスレッドのこの別の回答で与えられました...この不完全な文がより多くの投票を得たことは奇妙です。
CPHPython 2018

70

N番目の要素は、言語構造「list」で取得できます。

// First item
list($firstItem) = $yourArray;

// First item from an array that is returned from a function
list($firstItem) = functionThatReturnsArray();

// Second item
list( , $secondItem) = $yourArray;

ではarray_keysファンクションあなたはキーのために同じことを行うことができます。

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

2
これがまさに私が行うことですlist($first_value) = $my_array;。私の意見では、最良のオプションです。ここに示されている他の回答の問題はありません。アレイをコピーしたり、アレイを作成したり、新しいアレイを作成したりしないため、「やり過ぎ」はありません。「参照」なし:配列は変更されません。「リセット」なし:配列の内部ポインターは変更されません...
J. Bruni

6
非常にエレガントなソリューションですが、配列が空の場合はE_NOTICEをスローします。
Tgr

1
@マイクはい、でもそれはもうそれほどエレガントではありません:)
Tgr

13
これは間違っていませんか?!配列キーがintである場合にのみ機能list($firstItem) = array('key1' => 'value1');します。実行するとエラーが発生しますNotice: Undefined offset: 0
Marco Demaio

12
明確にする:はとlist($x) = foo();同等$x = foo()[0];です。これは、「最初の項目を取得する」と必ずしも同じではないことに注意してください。整数でインデックス付けされた配列でも、キー0の要素がない場合があるためです。私の場合、「list($ order)= get_order($ user) ; " しかし、「get_order」は、通常0ではないIDでキー付けされた注文を返していました。@ Sergiyが言うように、array_values()はこれを修正しますが、コードの効率と(さらに重要なことに)可読性を損ないます。
ウォーボ2013

55

PHP 5.4以降:

array_values($array)[0];

これは、最新かつ最高を実行するクールな人々のためのものです。;)
Zenexer 2013年

1
2013年10月に彼は彼の回答を編集して、4月に追加した私の回答を含めました。
Samer Ata

PHP 4:$array_values = array_values($array); $value = $array_values[0];
zdick、

38

PHP 7.3では、元の配列を変更せずに一時オブジェクトを作成せずに、配列の最初と最後のキーを直接取得するための2つの関数が追加されました。

これらの関数は、意味的に意味があることは別にして、(foreachそうするように)配列ポインターを移動することすらありません。

キーがあれば、キーによって直接値を取得できます。


例(すべてにPHP 7.3以降が必要です)

最初/最後のキーと値を取得する:

$my_array = ['IT', 'rules', 'the', 'world'];

$first_key = array_key_first($my_array);
$first_value = $my_array[$first_key];

$last_key = array_key_last($my_array);
$last_value = $my_array[$last_key];

配列を空にできないと仮定して、最初と最後の値を1行で取得します

$first_value = $my_array[ array_key_first($my_array) ];

$last_value = $my_array[ array_key_last($my_array) ];

空の配列のデフォルトで、最初と最後の値をワンライナーとして取得します。

$first_value = empty($my_array) ? 'default' : $my_array[ array_key_first($my_array) ];

$last_value = empty($my_array) ? 'default' : $my_array[ array_key_last($my_array) ];

短く、ヌル合体演算子、通常、nullはデフォルトではそうである: $first_value = $my_array[array_key_first($my_array)] ?? null;
ミッチェルマッケナ

29

と仮定します:

$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

ただ使用する:

$array[key($array)]

最初の要素を取得する、または

key($array)

最初のキーを取得します。

または、削除したい場合は、最初のリンクを解除できます。


9
単純に使用しないのcurrentはなぜですか?
Marco Demaio 2013年

27

一部の配列はlistresetまたはのような関数では機能しませんcurrent。多分、それらは「偽の」配列です-たとえば、部分的にArrayIteratorを実装しています。

配列に関係なく最初の値を取得したい場合は、イテレータを短絡できます:

foreach($array_with_unknown_keys as $value) break;

その後、値はで使用可能に$valueなり、ループは最初の反復の後で中断します。これは、潜在的に大きな配列をarray_unshift(array_values($ arr))のような関数にコピーするよりも効率的です。

この方法でもキーを取得できます。

foreach($array_with_unknown_keys as $key=>$value) break;

これを関数から呼び出す場合は、早期に戻るだけです。

function grab_first($arr) {
    foreach($arr as $value) return $value;
}

これは最も高速な方法の1つだと思います。これは、関数呼び出しではなく言語構成foreachを使用するためです(コストが高くなります)。 designcise.com/web/tutorial/...
イルダルAmankulov

19

Laravelのヘルパーから:

function head($array)
{
    return reset($array);
}

配列が値によって関数に渡されると、reset()は配列のコピーの内部ポインタに影響し、元の配列には影響しません(false配列が空の場合は返されます)。

使用例:

$data = ['foo', 'bar', 'baz'];

current($data); // foo
next($data); // bar
head($data); // foo
next($data); // baz

また、これは代替手段です。それは非常にわずかに高速ですが、より興味深いです。配列が空の場合、デフォルト値を簡単に変更できます。

function head($array, $default = null)
{
    foreach ($array as $item) {
        return $item;
    }
    return $default;
}

ちなみに、配列の最後の要素についての別の答えは次のとおりです


17

これをシンプルにしてください!ここには多くの正しい答えがありますが、すべての混乱を最小限に抑えるために、これらの2つは機能し、多くのオーバーヘッドを削減します。

key($array)配列の最初のキーを取得します配列
current($array)の最初の値を取得します


編集:
以下のコメントについて。次の例は出力します:string(13) "PHP code test"

$array = array
(
   '1'           => 'PHP code test',  
   'foo'         => 'bar', 5 , 5 => 89009, 
   'case'        => 'Random Stuff: '.rand(100,999),
   'PHP Version' => phpversion(),
   0             => 'ending text here'
);

var_dump(current($array));

11
うーん。current現在の要素に等しい。配列の先頭にポインタをリセットして、それが実際に先頭にあることを確認する必要があります。
ウォータールー

current()は、最初の要素ではなく、現在の要素を取得します。違います。
Amirhossein Tarmast

配列に要素が1つしかない場合は、currentが機能します。
Zameer Fouzan


14

私はそうするでしょうecho current($array)


1
@hsz current()非参照が渡されても問題ではなく、エラーにもなりません。ポインターがまだ最初にある場合、これは機能します。
Dan Lugg、2013

しかし、それはあなたのログを汚くてよくする通知を生成します...通知が重要でなければ、通知も取り除くべきです
dmikam

1
@dmikamいいえ、ありません。実際にresetは「参照によって渡される変数のみ」という通知が生成されますが、生成されcurrentません:オンラインPHPエディターの例current(array_filter(...));
CPHPython 2018

@CPHPython、あなたは正しいようです...私がPHP 4の昔からのこの現在の考えを持っていたように見えますが、それは本当に致命的なエラーを引き起こします:sandbox.onlinephpfunctions.com/code/… 現在の使用で見られる唯一の問題は、返された要素が配列の最初の要素であることを保証しないこと(内部ポインタは呼び出された関数によって変更される場合があります)。事実上、配列のランダムな要素を返す場合があります。
dmikam 2018

1
@CPHPython少し人工的な例ですが、私の考えをよく表し ています:sandbox.onlinephpfunctions.com/code/…next()、を使用する関数、end()または配列の内部ポインターを変更する他の関数から配列を受け取ったと想像してください。私の例でcurrent()は、内部ポインタが配列の「範囲外」であるため、nullを返します。しかし、それは「事実上」、任意の/ランダムな要素を指す場合もあります。
dmikam

13
$arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
foreach($arr as $first) break;
echo $first;

出力:

apple

10
$myArray = array (4 => 'apple', 7 => 'orange', 13 => 'plum');
$arrayKeys = array_keys($myArray);

// The first element of your array is:
echo $myArray[$arrayKeys[0]];

私はそれが受け入れられた答えで説明されている方法を実行しませんでした。使用あなたのおかげ
JayKandari

9
$array=array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

$firstValue = each($array)[1];

これはarray_values()each()関数が配列全体をコピーしないためよりもはるかに効率的です。

詳細については、http: //www.php.net/manual/en/function.each.phpを参照してください


because the each() function does not copy the entire array.+1

2
しかし、重要なのは、内部ポインタが先頭にない場合、最初に要素を取得することができないため、前にリセットを行う必要があるということです。
Carlos Goce 14

しかし、each()は参照によって配列を受け取り、最初の質問の要件はそうしないことです
dmikam

8

不器用な方法は次のとおりです。

$foo = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

function get_first ($foo) {
    foreach ($foo as $k=>$v){
        return $v;
    }
}

print get_first($foo);

3
少なくともあなたは正直です-それは無愛想です!しかし、それは機能し、上記のlist()テクニックを学ぶまでは、以前から使用していました。
random_user_name 2013年

1
これを行っている場合は、とにかく呼び出さreset()れる前に配列ポインタがリセットされるため、使用することもできforeachます。
Tyzoid 2014年


7

これらのほとんどは動作します!しかし、迅速な単一行(リソース不足)呼び出しの場合:

$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
echo $array[key($array)];

// key($array) -> will return the first key (which is 4 in this example)

これはうまくいきますが、まあまあですが、私の追加の回答もご覧ください:https : //stackoverflow.com/a/48410351/1804013


5
これはcurrent($array)、を使用するのと同じです。これは、配列の内部ポインタがとにかく最初の要素にあることが必要であり、その場合echo reset($array)が最も適切です。
Tyzoid

@Tyzoid彼は実際にあなたの提案別の答えをここに書いたが、彼はあなたの説明を省略した...ありがとう。
CPHPython 2018

@Tyzoid:私は追加の回答/更新をしばらくしながら行いました:stackoverflow.com/a/48410351/1804013
tfont

5

ここではarray_valuesを使用するのが最善のだと思います。その関数の結果からインデックス0の値を返し、「apple」を取得できます。


5

これは少し遅いですが、配列に子として配列要素が含まれているため、最初の配列要素の文字列表現を取得できないという問題が発生しました。することで、PHPの使用してcurrent()機能を、私はこれを管理します:

<?php
    $original = array(4 => array('one', 'two'), 7 => array('three', 'four'));
    reset($original);  // to reset the internal array pointer...
    $first_element = current($original);  // get the current element...
?>

現在のすべての解決策のおかげでこの答えを得ることができましたが、これが誰かに役立つことを願っています!


4

使用する:

$first = array_slice($array, 0, 1);  
$val= $first[0];

デフォルトでarray_sliceははキーを保持しないため、インデックスとしてゼロを安全に使用できます。


4

あなたのための2つのソリューション。

解決策1-キーを使用するだけです。使えないとは言わなかった。:)

<?php
    // Get the first element of this array.
    $array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

    // Gets the first element by key
    $result = $array[4];

    // Expected result: string apple
    assert('$result === "apple" /* Expected result: string apple. */');
?>

解決策2-array_flip()+ key()

<?php
    // Get first element of this array. Expected result: string apple
    $array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

    // Turn values to keys
    $array = array_flip($array);

    // You might thrown a reset in just to make sure
    // that the array pointer is at the first element.
    // Also, reset returns the first element.
    // reset($myArray);

    // Return the first key
    $firstKey = key($array);

    assert('$firstKey === "apple" /* Expected result: string apple. */');
?>

解決策3-array_keys()

echo $array[array_keys($array)[0]];

2

これは現実の世界ではそれほど単純な対応ではありません。一部のライブラリで見つけることができる可能な応答のこれらの例があるとします。

$array1 = array();
$array2 = array(1,2,3,4);
$array3 = array('hello'=>'world', 'foo'=>'bar');
$array4 = null;

var_dump('reset1', reset($array1));
var_dump('reset2', reset($array2));
var_dump('reset3', reset($array3));
var_dump('reset4', reset($array4)); // Warning

var_dump('array_shift1', array_shift($array1));
var_dump('array_shift2', array_shift($array2));
var_dump('array_shift3', array_shift($array3));
var_dump('array_shift4', array_shift($array4)); // Warning

var_dump('each1', each($array1));
var_dump('each2', each($array2));
var_dump('each3', each($array3));
var_dump('each4', each($array4)); // Warning

var_dump('array_values1', array_values($array1)[0]); // Notice
var_dump('array_values2', array_values($array2)[0]);
var_dump('array_values3', array_values($array3)[0]);
var_dump('array_values4', array_values($array4)[0]); // Warning

var_dump('array_slice1', array_slice($array1, 0, 1));
var_dump('array_slice2', array_slice($array2, 0, 1));
var_dump('array_slice3', array_slice($array3, 0, 1));
var_dump('array_slice4', array_slice($array4, 0, 1)); // Warning

list($elm) = $array1; // Notice
var_dump($elm);
list($elm) = $array2;
var_dump($elm);
list($elm) = $array3; // Notice
var_dump($elm);
list($elm) = $array4;
var_dump($elm);

ご覧のとおり、いくつかのケースではうまくいくが、すべてではないいくつかの「1行」ソリューションがあります。

私の意見では、そのハンドラーは配列でのみ使用する必要があります。

次のように、常に配列があると仮定して、パフォーマンスについて説明します。

$elm = empty($array) ? null : ...($array);

...you would use without errors:
$array[count($array)-1];
array_shift
reset
array_values
array_slice

array_shiftは[よりも高速reset、つまり[count()-1]よりも高速でarray_valuesあり、これら3つはおよびよりも高速ですarray_slice


2

作者が配列の最初の要素をいくつかの関数(たとえばmysql_fetch_rowなど)から取得した後、STRICT "変数のみを参照で渡す必要がある"を生成せずに配列を取得する方法を探していたと想像します。

その場合は、ここで説明するほとんどすべての方法でこのメッセージが表示されます。それらのいくつかは、配列(またはその一部)を複製するために大量の追加メモリを使用します。これを回避する簡単な方法は、これらの関数を呼び出す前にインラインで値を割り当てるだけです。

$first_item_of_array = current($tmp_arr = mysql_fetch_row(...));
// or
$first_item_of_array = reset($tmp_arr = func_get_my_huge_array());

この方法では、画面やログにSTRICTメッセージが表示されず、追加の配列も作成されません。インデックス付きのAND連想配列の両方で機能します。


1

「リスト」の例は好きですが、「リスト」は課題の左側でのみ機能します。変数を割り当てたくない場合は、一時的な名前を作成する必要があります。一時的な名前は、スコープを汚染し、最悪の場合は既存の値を上書きします。

list($x) = some_array();
var_dump($x);

上記は$ xの既存の値を上書きし、$ x変数はこのスコープがアクティブである限り(この関数/メソッドの最後、またはトップレベルにいる場合は永久に)ハングします。これは、call_user_funcと無名関数を使用して回避できますが、不格好です。

var_dump(call_user_func(function($arr) { list($x) = $arr; return $x; },
                        some_array()));

このような無名関数を使用すると、参照渡しを使用していても、resetとarray_shiftを実際に使用できます。これは、関数を呼び出すと引数がバインドされ、これらの引数を参照渡しすることができるためです。

var_dump(call_user_func(function($arr) { return reset($arr); },
                        array_values(some_array())));

ただし、call_user_funcがこの一時的な割り当てを内部で実行するため、これは実際にはやりすぎです。これにより、警告渡しやエラーなしに、参照渡し関数を値渡しのように扱うことができます。

var_dump(call_user_func('reset', array_values(some_array())));

1

Sarfrazが投稿したものに対する小さな変更は次のとおりです。

$array = array(1, 2, 3, 4, 5);
$output = array_slice($array, 0, 1);
print_r ($output);

1

配列の内部ポインタをいじるのは好きではありませんが、array_keys()or を使用して2番目の配列を作成するのも非効率なarray_values()ので、通常は次のように定義します。

function array_first(array $f) {
    foreach ($f as $v) {
        return $v;
    }
    throw new Exception('array was empty');
}

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