[解決済み] 配列の最後の要素を削除せずに取得する最適な方法は?
質問
わかりました。
については、すべて知っています。
array_pop()
しかし、それは最後の要素を削除します。 配列の最後の要素を削除せずに取得する最良の方法は何でしょうか?
EDIT: ここでオマケです。
$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
解決方法は?
このスレッドにある多くの回答は、私たちに多くの異なる選択肢を提示しています。その中から選択するために、私はそれらの動作とパフォーマンスを理解する必要がありました。この回答では、PHPのバージョンに対してベンチマークを行い、私の発見を共有します。
5.6.38
,
7.2.10
と
7.3.0RC1
(
2018年12月13日予定
).
オプション(
<<option code>>
の)をテストします。
-
オプション.1.
$x = array_values(array_slice($array, -1))[0];
( 提案したように によって ローラッチャ ) -
オプション.2.
$x = array_slice($array, -1)[0];
( 提案したように によって ストゥーティ ) -
オプション.3.
$x = array_pop((array_slice($array, -1)));
( 提案したように によって ローラッチャ ) -
オプション.4.
$x = array_pop((array_slice($array, -1, 1)));
( 提案したように によって ウェスティ92 ) -
オプション .5.
$x = end($array); reset($array);
( 提案したように によって イズノグッド ) -
オプション.6.
$x = end((array_values($array)));
( 提案したように によって TecBrat ) -
オプション .7.
$x = $array[count($array)-1];
( 提案したように によって ミルコ・パグリアイ ) -
オプション .8.
$keys = array_keys($array); $x = $array[$keys[count($keys)-1]];
( 提案したように によって スラウ ) -
オプション .9.
$x = $array[] = array_pop($array);
( 提案したように によって ユーザー2782001 ) -
オプション10
$x = $array[array_key_last($array)];
( 提案したように によって クワジモドクローン PHP 7.3 で利用可能)
(言及されている関数。 配列_キー_ラスト , 配列キー , array_pop , アレイスライス , 配列値 , カウント , 終了 , リセット )
テスト入力(
<<input code>>
s)と結合する。
-
ヌル
=
$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.38
,
7.2.10
と
7.3.0RC1
PHPのDockerコンテナ
のようなものです。
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分の1秒)です。
その結果は以下の通りです。
/==========================================================================================================================================================================================================================================================================================================================================================================================================================\
|| || 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 アニングと N otice codeは、次のように翻訳します。
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]];
-
オプション .6.
-
これらのオプションは、非常に大きなアレイに最適です。
-
オプション .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 以降)
-
オプション .5.
-
これらのオプションは
は自動インデックス配列にのみ使用します。
:
-
オプション.7.
$x = $array[count($array)-1];
(を使用するためcount
) -
オプション .9.
$x = $array[] = array_pop($array);
(元のキーを失った値を代入しているため)
-
オプション.7.
-
このオプション
は、配列の内部ポインタを保持しません。
-
オプション0.5.
$x = end($array); reset($array);
-
オプション0.5.
-
このオプションは
オプション.5.
を使用すると、配列の内部ポインタを保持することができます (しかし、悲しいかな、これは非常に大きな配列の場合にはうまく機能しません)。
-
オプション.6.
$x = end((array_values($array)));
-
オプション.6.
-
新しい
array_key_last
関数は、この記事の執筆時点ではまだRCであることを除いて、上記のような制限はないようです(そのため、RCを使用するか、2018年12月のリリースを待ちます)。-
オプション10
$x = $array[array_key_last($array)];
(PHP 7.3 以降)
-
オプション10
かどうかに応じて少し 配列をスタックとして使用するか、キューとして使用するか を使えば、オプション9のバリエーションを作ることができます。
関連
-
[解決済み】Weird PHP error: 'Can't use function return value in write context'.
-
[解決済み] コマンドの同期がとれていない。
-
[解決済み】PHP フェイタルエラー。未定義の関数mssql_connect()をコールしています。
-
[解決済み] PHPで配列から要素を削除する
-
[解決済み] Java の配列を表示する最も簡単な方法は何ですか?
-
[解決済み] 配列の最後の項目を取得する
-
[解決済み] 配列の最初の要素を取得する
-
[解決済み] Bashでインデックスを指定せずに配列に新しい要素を追加する
-
[解決済み] Pythonで配列の長さを取得するには、arr.__len__()が好ましいですか?
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Fatal error: 未定義の関数 sqlsrv_connect() を呼び出した。
-
[解決済み】変な電話番号を生成するフェイカー?
-
[解決済み】phpMyAdmin: シークレットパスフレーズ?
-
[解決済み] Uncaught SyntaxError: JSON の位置 1 に予期しないトークン o があります。
-
[解決済み] Uncaught Error: 未定義の関数 mysql_escape_string() の呼び出し。
-
[解決済み】MySQLのカラム数が1行目の値数と一致しない【非公開
-
[解決済み】mysqli::query(): mysqli をフェッチできない
-
[解決済み] PHP と mod_fcgid: handle_request_ipc 関数で ap_pass_brigade が失敗する。
-
[解決済み】phpのシンタックスエラー、予期しないT_IFエラーを修正する方法は?[クローズド]。
-
[解決済み] 配列の最初の要素を取得する