PHPで配列の先頭の要素を取得し元の配列から削除するarray_shiftの使い方

PHPで配列を作ったとき、先頭の値だけ取り出し削除したい場面があるかもしれません。

エスカレーターは乗った人から降りていきます。

降りた人はエスカレーターの上にはもういません。

ちょうどそんなイメージの配列操作の方法です。

 

この方法には array_shift() という関数が便利です。

配列の先頭の要素を取得し元の配列から削除するarray_shiftの使い方

array_shiftの使い方

array_shift(配列)

引数には先頭の値を取り出したい配列をセットします。

戻り値は、配列の先頭の値になります。配列が空の場合にはnullが返ってきます。

そして、処理後には引数にセットした配列から先頭の値が削除され、インデックスが詰められます。

array_shiftのサンプルコード

array_shiftを使ったサンプルコードです。

これを実行すると以下のようになります。

配列の先頭の”東京”を取得し、元の配列からは削除されました。

インデックスも詰められていることが分かります。

 

ループで処理する場合は以下のようになります。

結果は次の通りです。

配列が空になったら自動的にループ処理も終わります。

でもぱっと使う場面が思い浮かばないです(笑)

なんか昔使ったことあるんですけどね。

なんの処理で使ったのかな?

ただ先頭の値を取得し削除したくない

ただ配列の先頭の要素を取得し、削除したくない場合はどうでしょう?

単純に0番目取得は?

上記のコードでいいんじゃないだろうか?と思った方は注意です。

配列の0番目が確実に存在する場合ならいいかもしれません。

しかし、次のような場合にはエラーになります。

  • 配列に要素が存在しない場合
  • 0番目が既に削除され、配列の先頭の要素のインデックスが1になっている場合
  • 連想配列の場合

foreachを使ったら?

じゃあforeachを使ったら??

上のコードのように最初の値だけ取得してすぐにbreakしてしまえば先頭の要素が取得できます。

配列が既に空の場合は、foreach の前に $item をnullで初期化しているのでnullになります。

初期化しなくても、isset() などで値がセットされているか判定すれば大丈夫です。

 

だけど、foreach を使うと4行書かないといけないですよね。

先頭を取得したいだけなのにちょっと面倒な気がします。

配列の先頭の値を取得するのはreset()が便利

そんなとき便利なのがreset()です。

reset() は配列内部のポインタを先頭にセットする関数で、その点は今回はあまり関係ないです。

しかし、同時に先頭の要素を戻り値で返してくれます。

例えunset()で0番目の要素が削除されていても、残りの要素の先頭を返してくれます。

上のコードを実行すると以下のようになります。

元の配列もそのままです。(unset()で削除したものは削除されます。)

まとめ

これで問題は解決したでしょうか?

便利な関数を知らなくてもゴリゴリ自前のロジックで作成することも可能ですし間違ってはいませんが、既にテストもされている関数がある場合はそれを利用したほうがコードも減るしバグも減りますね!

配列から先頭を取得して、取得した要素を元の配列から削除する場合はarray_shiftを使います。

ただ配列から先頭を取得するだけで、取得した要素を削除しない場合はresetが使えます。

コロナの影響でみんな大変だから俺もなんかできること

僕は福井県に住んでいるのですが、戦時中に福井大空襲にあい、その直後に大震災にあってボロボロになった話をおばあちゃんに聞きました。

それでも復活することができ、不死鳥の町と言われるようになりました。

先人達には心から感謝し尊敬します。

リーマンショック、東日本大震災、コロナと数十年に一度と言われる被害が立て続けに起きていますが、僕たちは強いです。

今は苦しいかもしれませんがきっと復活できます。

僕は低学歴ですし小さな小さな粒でしかないですが、プログラミングに関しては必死に勉強し15年以上ごはんにありつけています。

プログラミングを勉強している人の役に立てるほどのスキルはあると思っています。

なので1人でもんもんと悩んでいる若手のエンジニア向けに質問を受け付けることにします。

自宅で待機されている間もパソコンとインターネットがあればプログラミングの勉強はできます。

  • PHP
  • SQL
  • HTML・CSS
  • jQuery

とは言ってもいきなり答えを聞いていたのではなかなか成長できないと思うのです。

なので質問の際には次のことをご連携ください。

  • 何をやりたいか
  • どんなことを調べたか、検索キーワードと参考にしたページのURL
  • 調べた結果どこが分からないか
  • できるなら試したコード

メッセージいはとりあえずTwitterにでもください。

質問はこちら

すぐに返事できないかもしれませんがご了承ください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA