フツイッター フェイスブック RSS

WEB作成からカメラ・ガジェット・PC系など雑多なブログ

WEB

配列とforeachループの理解を深める

2016年01月29日

2016年04月28日

Pocket

ループの用途

WordPressでよく使われるループである「foreach」ですが、今までなんとなくモヤモヤしたまま使っていましたが、ここは基本に立ち返って詳しく調べてみようと思います。

ループを使用する目的としては複数の配列が格納された中から、すべての配列またはパラメータで決めてピックアップした配列からプロパティを出力するといった用途で使われます。
具体的には「投稿一覧からWEB作成カテゴリの記事一覧を表示したい!」とか「この記事が所属するタグを全部を並べたい!」とか。メニューの表示なんかでも使ったりします。

そもそも配列とは?

「配列」は学校の名簿のようなもの

例として「投稿タイプ・固定タイプの全ての記事」を学校の全生徒だと仮定します。 その学校の3年1組にA君・B君・C君...と生徒がいて、出席番号1番のA君が保健委員・2番のB君が清掃委員・3番のC君が給食委員...と、それぞれ何かしらの役員を担当しています。

この場合3年1組が「投稿タイプの配列」、A君・B君・C君が「投稿記事の配列」、出席番号・役員名が「プロパティ」と解釈することができます。

ではこの配列から、3年1組の保健委員の生徒の名前と出席番号を書いた名札を作ってみましょう!

条件を与えて配列を作る

まず全生徒から「3年1組で保健委員」という条件で調べなければなりません。
全生徒から抽出する条件($args)で全生徒から調べる関数($get_post)を使って名簿($meibo)に代入します。

これで名簿($meibo)に3年1組で保健委員の人を集めることができました。 ただこれは名簿なので、複数名の情報(プロパティ)が書かれているため、ここからすぐに名札を作ることができません。
名札を作る情報を抽出するには、次にこの名簿から一人ずつ名前と出席番号の書かれた紙を用意する必要があります。

foreachループ処理を行って個別の配列に分ける

では名簿から情報に分けていきます。 ちょっと強引ですが、まずその名簿($meibo)を一人ずつのプロフィールにハサミを入れて切り離していきます。
そうすると個別に切り分けた生徒のプロフィール一覧($seito)が人数分できあがります。 これをforeach文に直すと、

これで名簿($meibo)から一人分の生徒のプロフィール一覧($seito)を作ることができました。
ちなみに「setup_postdata($seito)」は名札を作るときに次に書く生徒の紙を隣に用意しておく、とでも考えておいてください。

個別の配列から必要な値を抽出する

名簿から切り離した生徒一人分の情報から名札を作っていきます。

名簿($meibo)では複数名の情報が配列になっているために生徒一個人のプロフィールを抽出することはできませんでしたが、一人分の情報に切り分けたことでようやく必要なプロフィールを抽出することができました。
ここでようやく値としてプロパティの参照ができるわけです。

最後にループ文の閉じとリセットする一文を書いて終了です。

一応foreachループ処理はこんなところですが、そもそも配列が空の状態では何も処理ができないので、ループ文の前に「配列があるかどうかのチェック」処理をするのが慣例になっています。

foreachループ処理まとめ

すべてのソースをまとめるとこうなります。

ざっくりですがこんな感じ。 やや強引な仮定での説明になってしまいましたが、

1.値は何かしらの集合に属していてそれを「配列」と呼ぶ。
2.その配列もそれより大きな集合の「配列」になっている。
3.値(文章でも画像でも)を呼び出すには条件で切り分ける必要がある。
4.foreachループ処理は配列グループを個別の配列に分け、情報を抽出することができる。

ということです。
ループ処理にはwhileループもありますが、関連記事にリンクがありますのでそちらも参考にしてみてください。

この記事に関連する記事

WordPressでよく使われるwhileループ処理とサブループについて
WordPressでよく使われるwhileループ処理とサブループについて

WordPressで使われるループforeachについては前回の記事で書きましたが、今回はwhileループについて調べてみました。 併せて...

WordPressのループで使われるhave_posts・$postの役割と$wp_query
WordPressのループで使われるhave_posts・$postの役割と$wp_query

have_posts()関数で行われる処理。関数とは「どこかから値または配列を持ってきて何かしらの処理をする」ものなので、もちろんhave_...

Pocket

このカテゴリで良く読まれている記事
関連記事

COMMENT