配列の最後のキーを取得するにはどうすればよいですか?


回答:


610

解決策はend(引用)の組み合わせを使用することです:key

  • end() arrayの内部ポインタを最後の要素に進め、その値を返します。
  • key() 現在の配列位置のインデックス要素を返します。

したがって、このようなコードの一部でトリックを実行する必要があります。

$array = array(
    'first' => 123,
    'second' => 456,
    'last' => 789, 
);

end($array);         // move the internal pointer to the end of the array
$key = key($array);  // fetches the key of the element pointed to by the internal pointer

var_dump($key);

出力されます:

string 'last' (length=4)

つまり、私の配列の最後の要素のキー。

これが行われた後、配列の内部ポインタは配列の最後になります。コメントで指摘されているようreset()に、配列で実行して、ポインタを配列の先頭に戻すことができます。


17
@Pim:OPが後にその配列をどのように処理するかによって異なります(呼び出す必要がない場合がありますreset() ;; しかし、あなたはその機能を指し示しているので正しいでしょう。
Pascal MARTIN、2010

3
@PascalMARTIN +1回答にreset()に関するコメントを追加すると非常に役立つと思います。
ルル

この方法は、配列の値が重複している場合は機能しません。例えば。以下のためarray('a', 'b', 'c', 'd', 'a')には、キー0ではなく4よりも戻ります
マルク・

2
@Marcこの方法は、値が重複していても正しく機能します。
Jeff

1
@pppp動作しません。なぜなら、end()が返すものを確認してから、もう一度考え直してください;)
forsberg

79

end()最も簡単であるように思わ、それは最速ではありません。より速く、より強力な代替策はarray_slice()次のとおりです。

$lastKey = key(array_slice($array, -1, 1, true));

テストが言うように、500000要素を持つ配列では、ほぼ7倍高速です!


98
この答えに興奮して、100,000回の反復テストをend($arr);$key = key($arr);reset($arr);行い、(a)と(b)を比較$key = key(array_slice($arr,-1,1,true));したところend()、はるかに高速になりました!end()= 0.05326秒、array_slice = 8.506秒...ハァッ??
neokio 2012

54
PHPの組み込み関数は、極端なオタクによって作成されました。これらの関数を再作成しないでください。オッズは、オリジナルよりもはるかに遅いものを作成することです。あなたが何らかの邪悪な魔法使いではない限り。
dmmd 2013年

16
end()それはのような、非常に単純なC-関数から導出することができるので、最速である:int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
グスタフ

10
@Gustav PHPの基礎となるC実装には、実際lastには最後の要素への内部ポインタがあると思います。作りend()はかなりO(1)。:-)
エリック

15
@ dmmd、PHPチームは、彼らがオタクと呼ばれていることを非常に嬉しく思います。
datasn.io

53

私は好む

end(array_keys($myarr))

19
STRICT NOTICEを引き起こし、endは可変参照を期待します
Wiliam

25
end((array_keys($myarr)))通知を回避するために使用できます。
ベンフォーチュン

9
@BenFortuneこれはPHP7で修正されました:「PHP 5では、関数パラメーターの周りに冗長な括弧を使用すると、関数パラメーターが参照渡しされたときに厳密な標準警告が発生しなくなりました。この警告は常に発行されるようになりました。」
Dominic Sc​​heirlinck 2016年

これはまったく不要な警告です!他のすべての言語では、これは普通のことです。
azerafati 2016

1
他の言語では、関数はポインターを操作しませんか?
jurchiks 2016

52

PHP 7.3 (2018)以降、これについて(最終的に)関数があります:http : //php.net/manual/en/function.array-key-last.php

$array = ['apple'=>10,'grape'=>15,'orange'=>20];
echo array_key_last ( $array )

出力されます

orange

4
ホレイ!私はこの答えを追加しようとしていました。「PHP 7.3」バージョンと2018年をハイライトしていただけませんか?他人のために、この素晴らしいニュースを見つけることが容易になります
トマーシュVotruba

また、これは内部配列ポインタに影響を与えないことにも言及しておくとよいでしょう。
mvorisek

30

ただ使用する: echo $array[count($array) - 1];


75
これは、数値配列がある場合にのみ機能します。関連する配列で失敗します。
ジェレミーJスターチャー2012

12
これは数値配列でのみ機能するだけでなく、キーを表示できず、値を表示しますね。
2013年

ジェイクは、我々は両方の古い参照を持っていることを数値と連想ので、両方に我々はこれを分割するもの(正直に言うことができます)トップGoogleのヒットを行うことができ、私はあまりにも...私はそれを構文解析した後、連想のためだった働いたint top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }とします面白そうですが、時間の予算内にいるときはビジネスには適していません

5
また、数値配列の場合でも、数値配列は順番に並んだり、すべての数値を使用したりする必要がないことに注意してください。これは、数値に明示的に割り当てない場合は機能しますが、そうする場合は$a[1] = 1; $a[5] = 5; $a[0] = 0;、キー(1、5、0)をこの順序で持つ配列になります。 count($a)は3となり、$a[2]定義されていません。それは確かにあなたに5を返すことはありません。
Daniel Skarbek 14

1
「配列の最後のキーを取得する方法は?」という質問をもう一度読んでください。

20

これが高速になるかどうかはわかりませんが、このようにすると簡単に見えるようになり、関数をend()に渡さないことでエラーを回避しています...

変数が必要なだけです...コードをもう1行書くのは大したことではなく、必要に応じて設定を解除します。

$array = array(
    'first' => 123,
    'second' => 456,
    'last' => 789, 
);

$keys = array_keys($array);
$last = end($keys);

2
この答えは(技術的には正しいものですが)追加の配列(元の配列と同じ長さ)を作成する必要があるため、無駄/非効率的です。これは、元のアレイと同様に無駄が増えることを意味します。これは、Pascal MARTINの効率的な答えよりも選択すべきではありません。これには多くの賛成票があることに驚いています。
mickmackusa 2017

12

以下のようPHP7.3あなたは直接の最後のキー(の外側のレベル)を持つ配列にアクセスすることができます)(array_key_lastを

このページでの議論の多くを決定的に寝かせます。これは最高のパフォーマンスを発揮し、副作用を被ることはなく、この質問が求めるものを正確に提供するための直接的な直感的なシングルコールテクニックです。

証拠としての大まかなベンチマーク:https : //3v4l.org/hO1Yf

array_slice() + key():  1.4
end() + key():         13.7
array_key_last():       0.00015

*テスト配列には500000要素が含まれ、マイクロタイムが100倍に繰り返され、平均化され、1000が掛けられて、科学的表記が回避されます。@TadejMagajnaの回答の下でコメントされた最初のベンチマークの @MAChitgarhaへクレジット。

これは、次のコードなしで最終キーの値を取得できることを意味します。

  1. 配列ポインタの移動(2行のコードが必要)または
  2. キーの配列のソート、逆転、ポップ、カウント、インデックス付け、またはその他のtomfoolery

この関数は長い間待たれており、パフォーマンスを改善し、不要な副作用を回避し、クリーン/直接/直感的なコードを可能にする配列関数ツールベルトへの歓迎すべき追加機能でした。

ここにデモがあります:

$array = ["a" => "one", "b" => "two", "c" => "three"];
if (!function_exists('array_key_last')) {
    echo "please upgrade to php7.3";
} else {
    echo "First Key: " , key($array) , "\n";
    echo "Last Key: " , array_key_last($array) , "\n";
    next($array);                 // move array pointer to second element
    echo "Second Key: " , key($array) , "\n";
    echo "Still Last Key: " , array_key_last($array);
}

出力:

First Key: a
Last Key: c     // <-- unaffected by the pointer position, NICE!
Second Key: b
Last Key: c     // <-- unaffected by the pointer position, NICE!

いくつかのメモ:

  • array_key_last()array_key_first()の兄弟関数です。
  • これらの関数はどちらも「ポインタを無視」します。
  • null配列が空の場合、どちらの関数も戻ります。
  • 破棄された兄弟関数(array_value_first()array_value_last())も、ブックエンド要素へのポインタを無視したアクセスを提供しますが、明らかに、実現に十分な票を集めることに失敗しました。

新機能について説明している関連ページは次のとおりです。

ps誰かが他のテクニックのいくつかを比較検討している場合は、次の比較の小さなコレクションを参照してください:(デモ

Duration of array_slice() + key():     0.35353660583496
Duration of end() + key():             6.7495584487915
Duration of array_key_last():          0.00025749206542969
Duration of array_keys() + end():      7.6123380661011
Duration of array_reverse() + key():   6.7875385284424
Duration of array_slice() + foreach(): 0.28870105743408

2
この回答はリストの一番上にある必要があります。それは単に完全です。
John

1
うわー、この私の答えのDV?包括的/決定的/説明的/サポートされている問題は何でしたか?うん。間違いなくお知らせしたい投稿を押し下げ続けます。よくやった。わからない場合は、DVボタンは「役に立たない」投稿用です。ここであなたの目標は何かを自問してください。
mickmackusa

8

使用してみてくださいarray_popをしてarray_keysは、次のように機能します:

<?php

$array = array(
    'one' => 1,
    'two' => 2,
    'three' => 3
);

echo array_pop(array_keys($array)); // prints three

?>

14
配列に複数のものが含まれている場合、これは本当に遅くなります。これを行わないでください。
Andrey

3
STRICT NOTICEも引き起こします。可変参照
Wiliam

array_pop()は、元の配列を短くします(最後の要素を削除します)。これがOPにとって重要かどうかはわかりませんが、他の人にとっては重要です。
Programster

1
あんまり。この例でarray_pop()の戻り値で動作するarray_keys()しない元の配列に。
Petko Bossakov 2017年

通知をトリガーしない他のより効率的な回答があるため、私はこの回答に反対票を投じています。
mickmackusa 2017

6

PHP> = 7.3以降array_key_last()は、配列の最後のキーを取得する最良の方法です。組み合わせを使用してend()key()そしてreset()ちょうど配列の最後のキーを取得することは言語道断です。

$array = array("one" => bird, "two" => "fish", 3 => "elephant");
$key = array_key_last($array);
var_dump($key) //output 3

と比較して

end($array)
$key = key($array)
var_dump($key) //output 3
reset($array)

end()との組み合わせを使用している場合は、ポインタが先頭になるように配列をリセットする必要がありますkey()


4

この問題の代替ソリューションも提供したいと思います。

すべてのキーがギャップのない数値であると仮定すると、私の好ましい方法は、配列をカウントしてからその値から1を引いた数にすることです(配列キーが0で始まるという事実を説明するため)。

$array = array(0=>'dog', 1=>'cat');

$lastKey = count($array)-1;
$lastKeyValue = $array[$lastKey];

var_dump($lastKey);
print_r($lastKeyValue);

これはあなたに与えるでしょう:

int(1)猫


1
これは、キーがインクリメンタルでない配列では機能しません。例:array(0 => 'dog'、5 => 'cat'); $ lastKeyは間違った値を返します
kakoma 2015

@kakoma-私の投稿にあるように、「すべてのキーがギャップのない数値であると想定しています」。

PHPの「array_values」を使用して配列を数値の順番に再生成するのが不思議な人のために。php.net/manual/en/function.array-values.php

1
この回答は配列の可能性の一部(数値の連続したキー配列)のみを扱うため、この回答はOPの一般化された質問に対する堅牢で正確な回答を提供しません。反対票。
mickmackusa 2017

4

あなたはこれを使うことができます:

$array = array("one" => "apple", "two" => "orange", "three" => "pear");
end($array); 
echo key($array);

別の解決策は、関数を作成してそれを使用することです:

function endKey($array){
end($array);
return key($array);
}

$array = array("one" => "apple", "two" => "orange", "three" => "pear");
echo endKey($array);

1
この回答は、このスレッドにまだない新しいものを提供しません。
マーティン

1
マーティン、誰も結果を得るために関数を使いません。
Atif Tariq 2015

1
関数に1行のコードを追加する必要がありますか?それはどちらかというと不必要なインターフェースです。
マーティン

1
マーティン、一行。
Atif Tariq 2015

2
関数の行
マーティン

3
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'value3');
list($last_key) = each(array_reverse($arr));
print $last_key;
// key3

2
配列全体を反転して1つの値のみをプルすることは、PascalMARTINの方法よりも確かに効率的ではありません。技術的には正しいのですが、Pascalのアプローチの代わりに使用すべきではありません。
mickmackusa 2017

3

私はXanderからヘルパー関数を取得し、以前の回答で改善しました:

function last($array){
  $keys = array_keys($array);
  return end($keys);
}


$arr = array("one" => "apple", "two" => "orange", "three" => "pear");    
echo last($arr);
echo $arr(last($arr));

1

でこれを試してくださいarray_reverse()

 $arr = array(
     'first' => 01,
     'second' => 10,
     'third' => 20, 
 );  
 $key = key(array_reverse($arr));
 var_dump($key);

1

奇妙ですが、なぜこのトピックにこの答えがないのですか?

$lastKey = array_keys($array)[count($array)-1];


0
$array = array(
    'something' => array(1,2,3),
    'somethingelse' => array(1,2,3,4)
);

$last_value = end($array);
$last_key = key($array); // 'somethingelse'

PHPが$ arrayの配列ポインターを内部的に移動するため、これは機能します


2
これはPascalMARTINのメソッドの複製です。このページを空けて、遅い/重複した回答を削除してください。反対票。
mickmackusa 2017

0

インラインで使用することもできる最良のソリューション:

end($arr) && false ?: key($arr)

このソリューションは表現/ステートメントのみであり、優れたパフォーマンスを提供することはできません。

インライン使用例:

$obj->setValue(
    end($arr) && false ?: key($arr) // last $arr key
);


更新:PHP 7.3以降:(もちろん)新しく追加されたarray_key_last()メソッドを使用します。

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