配列の最後の要素を削除せずに取得する最良の方法は何ですか?


427

OK、

私はについてすべて知っていますarray_pop()が、最後の要素が削除されます。配列の最後の要素を削除せずに取得する最良の方法は何ですか?

編集:ここにボーナスがあります:

$array = array('a' => 'a', 'b' => 'b', 'c' => 'c');

あるいは

$array = array('a', 'b', 'c', 'd');
unset($array[2]);
echo $array[sizeof($array) - 1]; // Output: PHP Notice:  Undefined offset:  2 in - on line 4

11
それを信じるか、飛び出さずに戻すかは、私がこれをベンチマークした最速の方法の1つです。$ val = $ array [] = array_pop($ array); echo $ val;
user2782001

2
この質問は多くの選択肢をもたらしました。自分が選択しやすいように、最も注目すべき/明確なオプションをいくつか比較し、結果を別の回答として共有しました。(:@ user2782001は、上記のコメントでこれまでのところ私のお気に入りを提案しました。)貢献してくれたすべてに感謝します!
ポールファンレーウェン2017

1
@TheodoreRSmith PHP 7.3がリリースされたとき、あなたは(することを検討可能性があり、この提案によってカジモドのクローンご検討のための「受け入れ答え」()...
ポール・バンレイバン

回答:


176

このスレッドの多くの回答は、さまざまなオプションを提供します。それらから選択できるようにするには、彼らの行動とパフォーマンスを理解する必要がありました。この答えでは、私は、あなたと私の調査結果を共有するPHPのバージョンをベンチマーク5.6.387.2.10および7.3.0RC12018年12月13日を予想しました)。

<<option code>>テストするオプション(s)は次のとおりです。

(機能が挙げ:array_key_lastarray_keysarray_poparray_slicearray_valuesカウント終了リセット

<<input code>>組み合わせるテスト入力(s):

  • null =$array = null;
  • =$array = [];
  • last_null =$array = ["a","b","c",null];
  • auto_idx =$array = ["a","b","c","d"];
  • シャッフル =$array = []; $array[1] = "a"; $array[2] = "b"; $array[0] = "c";
  • 100 =$array = []; for($i=0;$i<100;$i++) { $array[] = $i; }
  • 100000 =$array = []; for($i=0;$i<100000;$i++) { $array[] = $i; }

私が使用するテストするための5.6.387.2.10および7.3.0RC1 PHPのドッキングウィンドウコンテナのように:

sudo docker run -it --rm php:5.6.38-cli-stretch php -r '<<<CODE HERE>>>'

上記<<option code>>のと<<input code>>の各組み合わせは、PHPのすべてのバージョンで実行されます。テストを実行するたびに、次のコードスニペットが使用されます。

<<input code>>  error_reporting(E_ALL);  <<option code>>  error_reporting(0); $before=microtime(TRUE); for($i=0;$i<100;$i++){echo ".";for($j=0;$j<100;$j++){  <<option code>>  }}; $after=microtime(TRUE); echo "\n"; var_dump($x); echo round(($after-$before)/(100*100)*1000*1000*1000);

実行ごとに、これはテスト入力の最後に取得された最後の値をvar_dumpし、1回の反復の平均継続時間をフェムト秒(0.000000000000001 )で出力します。

結果は次のとおりです。

/==========================================================================================================================================================================================================================================================================================================================================================================================================================\
||                                                                      ||                            T  E  S  T     I  N  P  U  T     -     5  .  6  .  3  8                            ||                             T  E  S  T     I  N  P  U  T     -     7  .  2  .  1  0                           ||                             T  E  S  T     I  N  P  U  T     -     7  .  3  .  0  R  C  1                     ||
||                                                                      ||          null |         empty |     last_null |      auto_idx |       shuffle |           100 |        100000 ||          null |         empty |     last_null |      auto_idx |       shuffle |           100 |        100000 ||          null |         empty |     last_null |      auto_idx |       shuffle |           100 |        100000 ||
||============================OPTIONS - ERRORS==========================++===============+===============+===============+===============+===============+===============+===============++===============+===============+===============+===============+===============+===============+===============++===============+===============+===============+===============+===============+===============+===============<|
||  1.  $x = array_values(array_slice($array, -1))[0];                  ||       W1 + W2 |            N1 |             - |             - |             - |             - |             - ||       W1 + W2 |            N1 |             - |             - |             - |             - |             - ||       W1 + W2 |            N1 |             - |             - |             - |             - |             - ||
||  2.  $x = array_slice($array, -1)[0];                                ||            W1 |            N1 |             - |             - |             - |             - |             - ||            W1 |            N1 |             - |             - |             - |             - |             - ||            W1 |            N1 |             - |             - |             - |             - |             - ||
||  3.  $x = array_pop((array_slice($array, -1)));                      ||       W1 + W3 |             - |             - |             - |             - |             - |             - ||  W1 + N2 + W3 |            N2 |            N2 |            N2 |            N2 |            N2 |            N2 ||  W1 + N2 + W3 |            N2 |            N2 |            N2 |            N2 |            N2 |            N2 ||
||  4.  $x = array_pop((array_slice($array, -1, 1)));                   ||       W1 + W3 |             - |             - |             - |             - |             - |             - ||  W1 + N2 + W3 |            N2 |            N2 |            N2 |            N2 |            N2 |            N2 ||  W1 + N2 + W3 |            N2 |            N2 |            N2 |            N2 |            N2 |            N2 ||
||  5.  $x = end($array); reset($array);                                ||       W4 + W5 |             - |             - |             - |             - |             - |             - ||       W4 + W5 |            N2 |            N2 |            N2 |            N2 |            N2 |            N2 ||       W4 + W5 |             - |             - |             - |             - |             - |             - ||
||  6.  $x = end((array_values($array)));                               ||       W2 + W4 |             - |             - |             - |             - |             - |             - ||  W2 + N2 + W4 |             - |             - |             - |             - |             - |             - ||  W2 + N2 + W4 |            N2 |            N2 |            N2 |            N2 |            N2 |            N2 ||
||  7.  $x = $array[count($array)-1];                                   ||             - |            N3 |             - |             - |             - |             - |             - ||            W7 |            N3 |             - |             - |             - |             - |             - ||            W7 |            N3 |             - |             - |             - |             - |             - ||
||  8.  $keys = array_keys($array); $x = $array[$keys[count($keys)-1]]; ||            W6 |       N3 + N4 |             - |             - |             - |             - |             - ||       W6 + W7 |       N3 + N4 |             - |             - |             - |             - |             - ||       W6 + W7 |       N3 + N4 |             - |             - |             - |             - |             - ||
||  9.  $x = $array[] = array_pop($array);                              ||            W3 |             - |             - |             - |             - |             - |             - ||            W3 |             - |             - |             - |             - |             - |             - ||            W3 |             - |             - |             - |             - |             - |             - ||
|| 10.  $x = $array[array_key_last($array)];                            ||            F1 |            F1 |            F1 |            F1 |            F1 |            F1 |            F1 ||            F2 |            F2 |            F2 |            F2 |            F2 |            F2 |            F2 ||            W8 |            N4 |            F2 |            F2 |            F2 |            F2 |            F2 ||
||========================OPTIONS - VALUE RETRIEVED=====================++===============+===============+===============+===============+===============+===============+===============++===============+===============+===============+===============+===============+===============+===============++===============+===============+===============+===============+===============+===============+===============<|
||  1.  $x = array_values(array_slice($array, -1))[0];                  ||          NULL |          NULL |          NULL | string(1) "d" | string(1) "c" |       int(99) |    int(99999) ||          NULL |          NULL |          NULL | string(1) "d" | string(1) "c" |       int(99) |    int(99999) ||          NULL |          NULL |          NULL | string(1) "d" | string(1) "c" |       int(99) |    int(99999) ||
||  2.  $x = array_slice($array, -1)[0];                                ||          NULL |          NULL |          NULL | string(1) "d" | string(1) "c" |       int(99) |    int(99999) ||          NULL |          NULL |          NULL | string(1) "d" | string(1) "c" |       int(99) |    int(99999) ||          NULL |          NULL |          NULL | string(1) "d" | string(1) "c" |       int(99) |    int(99999) ||
||  3.  $x = array_pop((array_slice($array, -1)));                      ||          NULL |          NULL |          NULL | string(1) "d" | string(1) "c" |       int(99) |    int(99999) ||          NULL |          NULL |          NULL | string(1) "d" | string(1) "c" |       int(99) |    int(99999) ||          NULL |          NULL |          NULL | string(1) "d" | string(1) "c" |       int(99) |    int(99999) ||
||  4.  $x = array_pop((array_slice($array, -1, 1)));                   ||          NULL |          NULL |          NULL | string(1) "d" | string(1) "c" |       int(99) |    int(99999) ||          NULL |          NULL |          NULL | string(1) "d" | string(1) "c" |       int(99) |    int(99999) ||          NULL |          NULL |          NULL | string(1) "d" | string(1) "c" |       int(99) |    int(99999) ||
||  5.  $x = end($array); reset($array);                                ||          NULL |   bool(false) |          NULL | string(1) "d" | string(1) "c" |       int(99) |    int(99999) ||          NULL |   bool(false) |          NULL | string(1) "d" | string(1) "c" |       int(99) |    int(99999) ||          NULL |   bool(false) |          NULL | string(1) "d" | string(1) "c" |       int(99) |    int(99999) ||
||  6.  $x = end((array_values($array)));                               ||          NULL |   bool(false) |          NULL | string(1) "d" | string(1) "c" |       int(99) |    int(99999) ||          NULL |   bool(false) |          NULL | string(1) "d" | string(1) "c" |       int(99) |    int(99999) ||          NULL |   bool(false) |          NULL | string(1) "d" | string(1) "c" |       int(99) |    int(99999) ||
||  7.  $x = $array[count($array)-1];                                   ||          NULL |          NULL |          NULL | string(1) "d" | string(1) "b" |       int(99) |    int(99999) ||          NULL |          NULL |          NULL | string(1) "d" | string(1) "b" |       int(99) |    int(99999) ||          NULL |          NULL |          NULL | string(1) "d" | string(1) "b" |       int(99) |    int(99999) ||
||  8.  $keys = array_keys($array); $x = $array[$keys[count($keys)-1]]; ||          NULL |          NULL |          NULL | string(1) "d" | string(1) "c" |       int(99) |    int(99999) ||          NULL |          NULL |          NULL | string(1) "d" | string(1) "c" |       int(99) |    int(99999) ||          NULL |          NULL |          NULL | string(1) "d" | string(1) "c" |       int(99) |    int(99999) ||
||  9.  $x = $array[] = array_pop($array);                              ||          NULL |          NULL |          NULL | string(1) "d" | string(1) "c" |       int(99) |    int(99999) ||          NULL |          NULL |          NULL | string(1) "d" | string(1) "c" |       int(99) |    int(99999) ||          NULL |          NULL |          NULL | string(1) "d" | string(1) "c" |       int(99) |    int(99999) ||
|| 10.  $x = $array[array_key_last($array)];                            ||           N/A |           N/A |           N/A |           N/A |           N/A |           N/A |           N/A ||           N/A |           N/A |           N/A |           N/A |           N/A |           N/A |           N/A ||           N/A |           N/A |           N/A |           N/A |           N/A |           N/A |           N/A ||
||=================OPTIONS - FEMTOSECONDS PER ITERATION=================++===============+===============+===============+===============+===============+===============+===============++===============+===============+===============+===============+===============+===============+===============++===============+===============+===============+===============+===============+===============+===============<|
||  1.  $x = array_values(array_slice($array, -1))[0];                  ||           803 |           466 |           390 |           384 |           373 |           764 |     1.046.642 ||           691 |           252 |           101 |           128 |            93 |           170 |        89.028 ||           695 |           235 |            90 |            97 |            95 |           188 |        87.991 ||
||  2.  $x = array_slice($array, -1)[0];                                ||           414 |           349 |           252 |           248 |           246 |           604 |     1.038.074 ||           373 |           249 |            85 |            91 |            90 |           164 |        90.750 ||           367 |           224 |            78 |            85 |            80 |           155 |        86.141 ||
||  3.  $x = array_pop((array_slice($array, -1)));                      ||           724 |           228 |           323 |           318 |           350 |           673 |     1.042.263 ||           988 |           285 |           309 |           317 |           331 |           401 |        88.363 ||           877 |           266 |           298 |           300 |           326 |           403 |        87.279 ||
||  4.  $x = array_pop((array_slice($array, -1, 1)));                   ||           734 |           266 |           358 |           356 |           349 |           699 |     1.050.101 ||           887 |           288 |           316 |           322 |           314 |           408 |        88.402 ||           935 |           268 |           335 |           315 |           313 |           403 |        86.445 ||
||  5.  $x = end($array); reset($array);                                ||           715 |           186 |           185 |           180 |           176 |           185 |           172 ||           674 |            73 |            69 |            70 |            66 |            65 |            70 ||           693 |            65 |            85 |            74 |            68 |            70 |            69 ||
||  6.  $x = end((array_values($array)));                               ||           877 |           205 |           320 |           337 |           304 |         2.901 |     7.921.860 ||           948 |           300 |           336 |           308 |           309 |           509 |    29.696.951 ||           946 |           262 |           301 |           309 |           302 |           499 |    29.234.928 ||
||  7.  $x = $array[count($array)-1];                                   ||           123 |           300 |           137 |           139 |           143 |           140 |           144 ||           312 |           218 |            48 |            53 |            45 |            47 |            51 ||           296 |           217 |            46 |            44 |            53 |            53 |            55 ||
||  8.  $keys = array_keys($array); $x = $array[$keys[count($keys)-1]]; ||           494 |           593 |           418 |           435 |           399 |         3.873 |    12.199.450 ||           665 |           407 |           103 |           109 |           114 |           431 |    30.053.730 ||           647 |           445 |            91 |            95 |            96 |           419 |    30.718.586 ||
||  9.  $x = $array[] = array_pop($array);                              ||           186 |           178 |           175 |           188 |           180 |           181 |           186 ||            83 |            78 |            75 |            71 |            74 |            69 |            83 ||            71 |            64 |            70 |            64 |            68 |            69 |            81 ||
|| 10.  $x = $array[array_key_last($array)];                            ||           N/A |           N/A |           N/A |           N/A |           N/A |           N/A |           N/A ||           N/A |           N/A |           N/A |           N/A |           N/A |           N/A |           N/A ||           370 |           223 |            49 |            52 |            61 |            57 |            52 ||
 \=========================================================================================================================================================================================================================================================================================================================================================================================================================/ 

上記のF atal 、W arning、Nの oticeコードは、

F1 = Fatal error: Call to undefined function array_key_last() in Command line code on line 1
F2 = Fatal error: Uncaught Error: Call to undefined function array_key_last() in Command line code:1
W1 = Warning: array_slice() expects parameter 1 to be array, null given in Command line code on line 1
W2 = Warning: array_values() expects parameter 1 to be array, null given in Command line code on line 1
W3 = Warning: array_pop() expects parameter 1 to be array, null given in Command line code on line 1
W4 = Warning: end() expects parameter 1 to be array, null given in Command line code on line 1
W5 = Warning: reset() expects parameter 1 to be array, null given in Command line code on line 1
W6 = Warning: array_keys() expects parameter 1 to be array, null given in Command line code on line 1
W7 = Warning: count(): Parameter must be an array or an object that implements Countable in Command line code on line 1
W8 = Warning: array_key_last() expects parameter 1 to be array, null given in Command line code on line 1
N1 = Notice: Undefined offset: 0 in Command line code on line 1
N2 = Notice: Only variables should be passed by reference in Command line code on line 1
N3 = Notice: Undefined offset: -1 in Command line code on line 1
N4 = Notice: Undefined index:  in Command line code on line 1

この出力に基づいて、以下の結論を導き出します。

  • PHPの新しいバージョンは、大幅に遅くなるこれらのオプションを除いて、パフォーマンスが向上します。
    • オプション.6。 $x = end((array_values($array)));
    • オプション.8。 $keys = array_keys($array); $x = $array[$keys[count($keys)-1]];
  • これらのオプションは、非常に大規模なアレイに最適です。
    • オプション.5。 $x = end($array); reset($array);
    • オプション.7。 $x = $array[count($array)-1];
    • オプション.9。 $x = $array[] = array_pop($array);
    • オプション10. $x = $array[array_key_last($array)];(PHP 7.3以降)
  • これらのオプションは、自動インデックス配列にのみ使用する必要があります
    • オプション.7。 $x = $array[count($array)-1];(の使用によるcount
    • オプション.9。 $x = $array[] = array_pop($array);(元のキーを失う値を割り当てるため)
  • このオプションは、配列の内部ポインタを保持しません
    • オプション.5。 $x = end($array); reset($array);
  • このオプションは、オプション.5を変更する試みです。配列の内部ポインタを保持するため(ただし、残念ながら、非常に大きな配列の場合はうまく拡張できません)
    • オプション.6。 $x = end((array_values($array)));
  • 新しいarray_key_last関数には、この記事の執筆時点ではまだRCであることを除いて、上記の制限はないようです(RCを使用するか、2018年12月のリリースを待ちます)。
    • オプション10. $x = $array[array_key_last($array)];(PHP 7.3以降)

配列をスタックとして使用するか、キューとして使用するかに応じて、オプション9を変更できます。


特定のオプションが見つからない場合は、上記のコードスニペットをコピーして貼り付け、以前にテストしたオプションと比較することで、自分でテストできます。このリストにオプションを追加すると、すべての組み合わせを再テストして、同等のパフォーマンス結果を得ることができます。追加する必要があると思う特定のオプションがある場合は、コメントをドロップしてください。その場合は、追加するつもりです(多少時間がかかる場合があります)。
Paul van Leeuwen

1
非常に素晴らしい答えですが、1つのコメントがあります。連想配列の場合、オプション9は使用できません。以前のキー名の代わりに自動インデックスキーに割り当て直すためです。
Gras Double

1
いいまとめ!新しいPHP 7.3を使用して私の答えを追加してください。$array[array_key_last($array)];あなたのベンチマークに機能します。完了したら通知を送ってください。パフォーマンスの結果を比較してみたいと思います。
カジモドのクローン

2
@szそれは主に多くの頑固さと忍耐力で生産されましたが、Sublimeテキストエディターの一般的な選択機能と複数行編集機能が役立ちました。再生成にはほぼ1日かかりました。そのため、もう一度実行する必要がある場合は、210個のすべてのdocker実行の出力を自動的にテーブルに変換するものをおそらく作成します:-)
Paul van Leeuwen

1
@ quasimodos-clone最新リリースのPHP 5、7、およびRCに基づいてテーブル全体を再生成しました。実際にリリースされる12月に再び生成したいと思います。この新しい機能を皆さんの注目を集めてくれてありがとう。
ポールファンレーウェン

487

試す

$myLastElement = end($yourArray);

リセットするには(@hopeseekrに感謝):

 reset($yourArray);

マニュアルへのリンク

@David Murdochが追加: $myLastElement = end(array_values($yourArray));// and now you don't need to call reset(). E_STRICTで警告が表示される

Strict Standards: Only variables should be passed by reference

o_O Tyncとみんなに感謝します!


38
使用する$myLastElement = end(array_values($yourArray));と、今呼び出す必要はありませんreset()
デビッドマードック

5
@DavidMurdochおそらく、RAMとCPUをチャーンし、配列値の一時配列を作成します...
Theodore R. Smith

12
サーバーが大量のRAMを消費しているために、1つの単純な追加関数を呼び出すことが取引の妨げになる場合は、サーバーの構成とリソースを再確認することをお勧めします。
Chris Baker

3
end(array_values())E_STRICT:「変数は参照渡しのみ」
kolypto

32
:厳しい警告を避けるために、追加のかっこを追加end((array_values($yourArray)))
ダニエル・W.

212

短くて甘い。

エラーメッセージを削除し、ワンライナーフォームと効率的なパフォーマンスを維持するための解決策を思いつきました。

$lastEl = array_values(array_slice($array, -1))[0];

-以前の解決策

$lastEl = array_pop((array_slice($array, -1)));

注:を回避するには、追加の括弧が必要ですPHP Strict standards: Only variables should be passed by reference


31
ちょうど5年6ヶ月2日後に、あなたはより優れた答えを提出しました!ありがとうございました!スタックオーバーフローに感謝します!!
セオドアR.スミス

1
あいさつをしますが、かっこを追加すると少しハッキリした感じがします。また、phpStormはこれをエラーとしてマークします。括弧を追加するための追加情報(phpsadness.com/sad/51)。エラーを克服するには、これを「2ライナー」にすることができます。$array = array_slice($array, -1); $lastEl = array_pop($array);個人的には、これは(パーサー「バグ」なしで)優れていると思います
モーリス

3
次のように逆参照を使用できます:array_slice($ array、-1)[0]
Vikash

1
配列のインデックスとして文字列がある場合はできません
rolacja

3
この回答では、PHP通知を回避するために、少なくとも2つのチェックが必要です。1.かどうかを確認しますarray_size() > 1 。2.配列が実際に配列であるかどうかを確認します。 PHPの組み込みend()関数はすでにすべてのハードワークをより効率的な方法で実行しているので、私はまだ@Iznogoodの答えに固執しています。
Ema4rl

37

何が問題になっていarray_slice($array, -1)ますか?(マニュアルを参照:http : //us1.php.net/array_slice

array_slice()配列を返します。おそらくあなたが探しているものではないでしょう。要素が必要です。


21
array_slice($array, -1)[0]要素を取得するために使用します。
2015年

2
これが答えです。「終了」配列の内部ポインタを変更しますか?トラブルを求めて、とても読みづらい!
Gerard ONeill、2015

@Pangが指摘するように、このアプローチは完全ではありませんが、気に入っています。 reset(array_slice($array, -1))は別のアプローチです(array_slice()単一要素の配列よりも「小さい」ものを返してもエラーにはなりません)
rinogo

要素を直接変更できるため、最善の方法:array_slice($array, -1)[0] = "";
HAlex

20

参照渡しエラー(たとえば、「end(array_values($ foo))」)を回避する1つの方法は、call_user_funcまたはcall_user_func_arrayを使用することです。

// PHP Fatal error: Only variables can be passed by reference
// No output (500 server error)
var_dump(end(array(1, 2, 3)));

// No errors, but modifies the array's internal pointer
// Outputs "int(3)"
var_dump(call_user_func('end', array(1, 2, 3)));

// PHP Strict standards:  Only variables should be passed by reference
// Outputs "int(3)"
var_dump(end(array_values(array(1, 2, 3))));

// No errors, doesn't change the array
// Outputs "int(3)"
var_dump(call_user_func('end', array_values(array(1, 2, 3))));

素晴らしいアプローチ!(ここに標準の「これは受け入れられる答えである必要があります」を挿入します)
Typo

3
または、追加の括弧を追加します。より短く、より甘い:end((array_values($yourArray)))
Dzhuneyt

4
余分な括弧のトリックは、PHPのバグに依存しており、そのアプローチは、それ以降のバージョンのPHPでは機能しません(少なくとも、PHP 7では機能しません)。
Matt Browne

1
また、このcall_user_funcトリックはPHP 7でも機能しません。一時的な変数を作成するのに困っていると思います。
マットブラウン2016年

15

内部ポインタを変更する必要がない場合(インデックス付き配列と連想配列の両方をサポート):

// false if empty array
$last = end($array);

// null if empty array
$last = !empty($array) ? end($array) : null;


内部ポインタを変更しないユーティリティ関数が必要な場合(配列は値で渡され、関数はそのコピーで動作するため):

function array_last($array) {
    if (empty($array)) {
        return null;
    }
    return end($array);
}

PHPは「オンザフライ」で、つまり実際に必要な場合にのみコピーを生成することに注意してください。のend()それ自体はそれほど内部配列のコピーが生成され、配列を変更します。


したがって、次の代替方法は、内部的には配列をコピーせず、スライスを作成するだけなので、実際には高速です。

function array_last($array) {
    if (empty($array)) {
        return null;
    }
    foreach (array_slice($array, -1) as $value) {
        return $value;
    }
}

この「foreach / return」は、最初の(ここでは単一の)アイテムを効率的に取得するための微調整です。


最後に、最速の代替手段ですが、インデックス付き配列のみです。

$last = !empty($array) ? $array[count($array)-1] : null;



記録のために、ここにある鉱山の別の答えは、配列の最初の要素のために、。


array_last関数に2つの代替実装を提供します。1 $arrayつ目はがコピーされ、2つ目はコピーされないことを示します。違いはどこですか/最初の実装ではコピーされ、2番目の実装ではコピーされないのはなぜですか?
ポールファンレーウェン2018年

1
@PaulvanLeeuwen私はあなたが混乱した理由を理解しました。私は答え明確にしようとしました、それはより良いですか?
グラダブル

10

テストされていません:これはうまくいきませんか?

<?php
$last_element=end(array_values($array));
?>

array_valuesによって返される配列は一時的なものであるため、そのポインターがリセットされても問題ありません。

それと一緒に行くための鍵が必要な場合、私はあなたがやると思います:

<?php
$last_key=end(array_keys($array));
?>

9

私はスタックを処理するためにこれを頻繁に必要とし、配列またはその内部ポインタを何らかの形で操作せずにそれを行うネイティブ関数はないことにいつも困惑しています。

そのため、通常は連想配列で安全に使用できるutil関数を持ち歩きます。

function array_last($array) {
    if (count($array) < 1)
        return null;

    $keys = array_keys($array);
    return $array[$keys[sizeof($keys) - 1]];
}

1
良い知らせです、彼らはそれをネイティブ機能にします:-)ここでのリリース計画を監視できます:wiki.php.net/todo/php73(この執筆時点で2018年12月13日予定)。
ポールファンレーウェン2018年

9

配列の最後の要素を取得するには、以下を使用します。

$lastElement = array_slice($array, -1)[0];

基準

私は1,000回繰り返し、それぞれ100および50,000要素を含む小さな配列と大きな配列の最後の要素を取得しました。

Method: $array[count($array)-1];
Small array (s): 0.000319957733154
Large array (s): 0.000526905059814
Note: Fastest!  count() must access an internal length property.
Note: This method only works if the array is naturally-keyed (0, 1, 2, ...).

Method: array_slice($array, -1)[0];
Small array (s): 0.00145292282104
Large array (s): 0.499367952347

Method: array_pop((array_slice($array, -1, 1)));
Small array (s): 0.00162816047668
Large array (s): 0.513121843338

Method: end($array);
Small array (s): 0.0028350353241
Large array (s): 4.81077480316
Note: Slowest...

PHPバージョン5.5.32を使用しました。


$ array [array_keys($ array)[count(array_keys($ array))-1]]の使用についてはどうですか?
user2782001

hmm..array_keysのスケーリングがかなり悪いようです。
user2782001

1
大規模な配列(0.0002)がアイテムをポップして元に戻すのは、実際には非常に高速です... $ val = $ ar [] = $ array_pop($ ar);
user2782001

1
@ Westy92あなたのユニットはベンチマークで間違っているようです。与える最小数は0.00031 ... マイクロ秒で、約0.3ナノ秒です。これは、新しいコンピュータを使用している場合、テストの実行に1クロックの目盛りがかかったことを意味します。私はあなたがミリ秒またはおそらく数秒を意味していたと思います。
セソイド

1
値は明らかに数桁間違っています。なぜとにかくパフォーマンスに焦点を合わせるのですか?
istepaniuk

6

end()は配列の最後の要素を提供します

$array = array('a' => 'a', 'b' => 'b', 'c' => 'c');
echo end($array); //output: c

$array1 = array('a', 'b', 'c', 'd');
echo end($array1); //output: d

1
このソリューションは機能しますが、配列の内部ポインターを変更します。正しい方法ではないと思います。
UnixAgain、2016

5

PHPバージョン7.3以降では、関数array_key_firstarray_key_lastが導入されています。

PHPの配列は厳密な配列型ではありません。つまり、インデックス0から始まる固定サイズのフィールドの固定サイズコレクションですが、動的に拡張された連想配列なので、不明なキーを持つ位置の処理は難しく、回避策はあまり機能しません。対照的に、実際の配列はポインター演算を介して非常に高速に内部的にアドレス指定され、最後のインデックスは宣言時にコンパイル時にすでにわかっています。

少なくとも最初と最後の位置に関する問題は、バージョン7.3以降の組み込み関数によって解決されています。これは、そのままの状態で配列リテラルに関する警告なしで機能します。

$first = array_key_first( [1, 2, 'A'=>65, 'B'=>66, 3, 4 ] );
$last  = array_key_last ( [1, 2, 'A'=>65, 'B'=>66, 3, 4 ] );

明らかに最後のは:

$array[array_key_last($array)];

1
これをみんなの注目を集めてくれてありがとう。これを使いたがっている人のために:これがこの執筆時点でのRCであることに注意してください。2018
Paul van Leeuwen '30

1
これは素晴らしいニュースです。以下の回答にポリフィル/シムを投稿したので、すぐにこの構文を使用できます。
Mark Thomson、

3
$lastValue = end(array_values($array))

$ arrayポインターは変更されません。これにより、

reset($array)

これは特定の条件では望ましくない場合があります。


3

私のために:

$last = $array[count($array) - 1];

連想では:

$last =array_values($array)[count($array - 1)]

回答の背景を教えてください。
Shawn、

2
@Shawnどのコンテキストですか?コンテキストは必要ありません。連想配列のコードを追加しました。
Mirko Pagliai 2016年

3

上位の回答は素晴らしいですが、@ paul-van-leeuwenと@ quasimodos-cloneで言及されているように、PHP 7.3はこの問題を直接解決する2つの新しい関数、array_key_first ()array_key_last()を導入しますます。

この構文は、次のポリフィル(またはシム)関数で今すぐ使用できます。

// Polyfill for array_key_last() available from PHP 7.3
if (!function_exists('array_key_last')) {
  function array_key_last($array) {
    return array_slice(array_keys($array),-1)[0];
  }
}

// Polyfill for array_key_first() available from PHP 7.3
if (!function_exists('array_key_first')) {
  function array_key_first($array) {
    return array_slice(array_keys($array),0)[0];
  }
}

// Usage examples:
$first_element_key   = array_key_first($array);
$first_element_value = $array[array_key_first($array)];

$last_element_key    = array_key_last($array);
$last_element_value  = $array[array_key_last($array)];

警告:これにはPHP 5.4以降が必要です。


2

これを行い、E_STRICTを回避し、配列の内部ポインターを混乱させないようにするには、次のように使用できます。

function lelement($array) {return end($array);}

$last_element = lelement($array);

lelementはコピーでのみ機能するため、配列のポインターには影響しません。


2

別の解決策:

$array = array('a' => 'a', 'b' => 'b', 'c' => 'c');
$lastItem = $array[(array_keys($array)[(count($array)-1)])];
echo $lastItem;

2

もう1つの可能な解決策...

$last_element = array_reverse( $array )[0];

連想配列で作業しないことは、私に反対票を投じる十分な理由とは思えません。質的にはこの答えはこの質問に対する他の多くの答えよりも悪くはありません。現時点で少なくとも2つの反対票が表示される理由がわかりません。(スコア-2)。とにかく、私に賛成票を投じて、それはそれほど悪くはありません。
ポールファンレーウェン

2

どうですか:

current(array_slice($array, -1))
  • 連想配列で機能します
  • いつ動作するか$array == [](戻りfalse
  • 元の配列には影響しません

2

以下のロジックを使用すると、配列から最後の要素を簡単に取得できます

$array = array('a', 'b', 'c', 'd');
echo ($array[count($array)-1]);

最後の要素だけでなく、以下のロジックを使用して、最後から2番目、最後から3番目などを取得することもできます。

2番目の最後の要素については、たとえば上記のステートメントで2番だけを渡す必要があります
。echo($ array [count($ array)-2]);


1

Arrayから最後の値を取得する場合:

array_slice($arr,-1,1) ;

配列の最後の値を削除する場合:

array_slice($arr,0,count($arr)-1) ;

1
array_slice($arr,-1,1)最後の要素ではなく、長さが1の別の配列になります
Vic

例を挙げましょう: $a=array("red","green","blue","yellow","brown"); print_r(array_slice($a,-1,1)); 結果:Array ( [0] => brown )
Rishabh

1

単に: $last_element = end((array_values($array)))

配列をリセットせず、STRICT警告も出しません。

PS。最も投票された回答にはまだ二重括弧がないため、この回答を送信しました。


1

これは、既存のすべての回答を少し改善したものだと思います。

$lastElement = count($array) > 0 ? array_values(array_slice($array, -1))[0] : null;
  • 特に大規模なアレイでは、end()を使用した場合よりもパフォーマンスが優れているarray_keys()
  • 配列の内部ポインタを変更しない
  • 空の配列の未定義のオフセットにアクセスしようとしない
  • 空の配列、インデックス付き配列、混合配列、および連想配列で期待どおりに機能します

残念ながら、これは連想配列では機能しません。スライスの単一のアイテムに名前付きキーがある場合があるためです。
Gras Double

あなたは正しい、修正を追加するために編集(array_values単一要素のスライスに)
アデルマー


1

最近では、php.net / end answerで提案されているように、常にこのヘルパーを使用することをお勧めします

<?php
function endc($array) {
    return end($array);
}

$items = array('one','two','three');
$lastItem = endc($items); // three
$current = current($items); // one
?>

これは常にポインタをそのまま維持し、括弧、厳密な基準などについて心配する必要はありません。


すでに上記のとおり:stackoverflow.com/a/45333947/1255289
miken32 '16


-1

配列のループ内にある配列の最後の要素を取得したい場合はどうなりますか?

以下のコードは無限ループになります:

foreach ($array as $item) {
 $last_element = end($array);
 reset($array);
 if ($last_element == $item) {
   // something useful here
 }
}

非連想配列のソリューションは明らかにシンプルです。

$last_element = $array[sizeof ($array) - 1];
foreach ($array as $key => $item) {
 if ($last_element == $item) {
   // something useful here
 }
}

2
end()およびreset()関数について知っています。私のコメントは、reeach関数がループの反復で使用される配列の内部ポインターをリセットするため、これらの関数を使用できないforeachまたはwhileのようなループに関連していました。申し訳ありませんが、質問はもっと簡単でした。プロジェクトで遭遇したより高度な状況を伝えたかっただけです。宜しくお願いします。
Vadim Podlevsky 2013年

これは多くの点で間違っており(重複のある配列、厳密でない比較など)、いずれの場合も実際には質問に関連していません。
Tgr

end($ array)関数を使用して最後の要素を取得します。なぜ不必要にループを使用するのですか?
Mahak Choudhary

1
@MahakChoudhary私のコメントは、「この配列のループ内で既に何らかの操作を行っている場合に、配列の最後の要素を取得する方法への追加です。end()を使用すると、インナーポインターがリセットされ、反復ループが中断されます。乾杯!
Vadim Podlevsky

-1
$file_name_dm =  $_FILES["video"]["name"];    

                           $ext_thumb = extension($file_name_dm);

                            echo extension($file_name_dm); 
function extension($str){
    $str=implode("",explode("\\",$str));
    $str=explode(".",$str);
    $str=strtolower(end($str));
     return $str;
}



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