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

ループの用途

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)に代入します。

$args[条件]= array[配列](
    'post_type[クラス]' => '3年1組',
    'category[委員]' => '保健委員'
);
$meibo[3年1組の保健員の名簿]= $get_post[全校生徒から抽出]($args[条件]);

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

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

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

foreach($meibo as $seito) : setup_postdata($seito);

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

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

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

<ul>
    <li>名前:<?php echo esc_html($seito -> name(名前))?></li>
    <li>出席番号<?php echo esc_html($seito -> ID(出席番号))?></li>
</ul>

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

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

endforeach;
wp_reset_postdata();

foreachループ処理まとめ

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

<?php
	$args = array(					//条件を決める
    	'post_type' => '3年1組',
    	'category' => '保健委員'
	);
	$meibo = $get_post($args);		//条件から配列を取得

	if($meibo) : //名簿に記載があるかをチェック。あれば以降の処理を行う
		foreach($meibo as $seito) : setup_postdata($seito);
?>
	<ul>
    	<li>名前:<?php echo esc_html($seito -> name)?></li>
    	<li>出席番号<?php echo esc_html($seito -> ID)?></li>
	</ul>
<?php
		endforeach;
	endif;
	wp_reset_postdata();
?>

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

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

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