web-dev-qa-db-ja.com

PHP配列に最後に挿入されたアイテムのインデックスを取得

タイトルと同じくらい簡単です。最後に挿入されたアイテムのインデックス/キーを取得する必要があります。なぜこれが難しいのですか?次の2つのコードサンプルを参照してください。

_$a=array();
echo 'res='.($a[]='aaa').' - '.(count($a)-1).'<br>';
echo 'res='.($a[]='bbb').' - '.(count($a)-1).'<br>';
echo 'res='.($a[]='aaa').' - '.(count($a)-1).'<br>';
die('<pre>'.print_r($a,true).'</pre>');
_

書き込み:

_res=aaa - 0
res=bbb - 1
res=aaa - 2
Array (
    [0] => aaa
    [1] => bbb
    [2] => aaa
)
_

確かに、それはうまくいくようですが、これを見てください:

_$a=array();
echo 'res='.($a[]='aaa').' - '.(count($a)-1).'<br>';
echo 'res='.($a[2]='bbb').' - '.(count($a)-1).'<br>';
echo 'res='.($a[]='aaa').' - '.(count($a)-1).'<br>';
die('<pre>'.print_r($a,true).'</pre>');
_

書き込み:

_res=aaa - 0
res=bbb - 1       <- wrong!
res=aaa - 2       <- wrong!
Array (
    [0] => aaa
    [2] => bbb    <- real key
    [3] => aaa    <- real key
)
_

つまり、一般的な回避策count($array)-1には欠陥があります。

50
Christian

linearfastest)ソリューションです:

end($a);
$last_id=key($a);
67
romaninsh

key($ a)end($ a) と一緒に使用できます

$a=array();
$a[]='aaa'; foo($a);
$a[3]='bbb'; foo($a);
$a['foo']='ccc'; foo($a);
$a[]='ddd'; foo($a);

function foo(array $a) {
  end($a);
  echo 'count: ', count($a), ' last key: ', key($a), "\n";
}

プリント

count: 1 last key: 0
count: 2 last key: 3
count: 3 last key: foo
count: 4 last key: 4
20
VolkerK

end() 関数を使用して配列の最後の要素を取得し、 array_keys() を使用して配列キーの配列を返すことができます。紛らわしい。実際には、次のように機能します。

$key = end(array_keys($array));

信用はコメントで大騒ぎする。

18
Sam152

配列の数値インデックスのみを使用している場合、最後に自動生成されたインデックスは常に配列の最大の配列キーになります。

そのため、自動生成されたインデックスの場合、max(array_keys($a))のようなものを使用する必要があります。

たとえば、これ:

$a=array();
echo 'res='.($a[]='aaa').' - '.(max(array_keys($a))).'<br>';
echo 'res='.($a[2]='bbb').' - '.(max(array_keys($a))).'<br>';
echo 'res='.($a[]='aaa').' - '.(max(array_keys($a))).'<br>';
die('<pre>'.print_r($a,true).'</pre>');

あなたを取得します:

res=aaa - 0
res=bbb - 2
res=aaa - 3

Array
(
    [0] => aaa
    [2] => bbb
    [3] => aaa
)


ただし、インデックスを指定している状況では機能しないことに注意してください...

2
Pascal MARTIN

0からn-1までの数値キーを持つ配列では、私は常に次を使用します。

$key = array_Push($array, $value)-1;

それは私が推測するより速くも簡単にもなりません。誰かが他のアレイで機能するこのようなものを手に入れた場合、私に知らせてください。

ああ、私は自分で答えを見つけたようです:

$last_id = array_pop(array_keys($a));
0
Christian