2015年1月19日 12:14

PHPで2つ以上の配列から1つづつ要素を取り出して表示する

PHP逆引きレシピ 第2版 (PROGRAMMER'S RECiPE)

最近特典リストのページと、あかめのアンテナ(ニュース羅列ページ)を作りました。phpのスクリプトでゲーマーズの公式サイト、自分のはてブをスクレイピングして表示しています。

各スクリプトで「2つの別配列から1つづつ要素を取り出して表示する」というのをやりました。3パターンの方法を試したのでコードをメモしておきます。

関連ページ
あかめのアンテナ
特典リスト
ゲーマーズの特典情報から1ヶ月分を一覧表示するテストページ作ってみた
PHP-Goutteライブラリのインストールとスクレイピング成功までのメモ

スポンサードリンク

for構文でやったパターン

1つ目のパターン。状況はこんな感じ。

$product = array(); //商品名とURLを結合した情報
$tokuten = array(); //特典の情報

この二つの配列に保存されてるvalueを0から1つづつ取り出して、横並びで表示させようとしました。

array(2){
	[0] => "productA"
	[1] => "productB"
}
array(2){
	[0] => "tokutenA"
	[1] => "tokutenB"
}

配列を別々の状態にしておいて、

for ($s=0; $s <= 20; $s++) {
	print $product[$s].$tokuten[$s]."<br>\n";
}

まず、$sを0から1づつ増やす繰り返し処理。

$productと$tokutenは配列の値が対応しており、配列の各要素には[]で添え字すると指定できるので、添え字部分に$sを突っ込む。

これで一応2つの配列から1つづつ取り出す繰り返し処理になりました。


keyとvalueを対応させて抜き出したパターン

このパターンは、2つの配列($link、$tag)からそれぞれ値、要素を1つづつ抜き出し、対応させて代入。

合体した後の配列から値と要素を1つづつ取り出すforeach(変数 as $key => $value){処理}を使いたかった時。

......めっちゃ無駄ですね。やる意味がないwww

array(2){
	[linkA] => ""
	[linkB] => ""
}
array(2){
	[0] => "tagA"
	[1] => "tagB"
}

2つの配列がある状態。

$s = 0;
foreach ($link as $key => $value){
	$i = 0;
	while ($i < 1){
		$link[ $key ] = $tag[$s];
		$i++;
	}
	$s++;
}

まず、foreachで$linkの値(添え字)を1つづつ選択する繰り返し処理。その中で、while()関数の繰り返し処理を行なうようにします。

$sはforeachのループが回るたび+1されていくので、$tag[$s]とすれば$tagの要素を1つづつ取り出します。

$iは、while内では1回しかループしませんが、foreachの中では最初に0が代入されるので、foreachのループが終わるまで何度でもループします。

これでforeachの繰り返し処理中に、別配列のfoeachを同時に回すみたいな処理ができます。

array(2){
	[linkA] => "tagA"
	[linkB] => "tagB"
}

結果こんな配列が出来上がるので後はもう一度foeach()を回せばおk。

うん...すごい無駄なことした。

複数の配列から1つづつ要素を抜き出して新しい多次元配列を作る

次が↓な状況。配列が複数あって各配列の値と要素を紐付けたい感じ。

// 上から$link,$tag,$product,$tokutenとする。
array(2){
	[0] => "linkA"
	[1] => "linkB"
}
array(2){
	[0] => "tagA"
	[1] => "tagB"
}
array(2){
	[0] => "ploductA"
	[1] => "ploductB"
}
array(2){
	[0] => "tokutenA"
	[1] => "tokutenB"
}

これら複数の配列を1つの多次元配列($output)にするのはfor構文で繰り返し処理。

for($s=0; $s < 20; $s++){
	$output[] = array($link[$s], $tag[$s], $product[$s], $tokuten[$s]);
}

$sを1づつ増やして、各配列の値に代入。まとめて1つづつ抜き出す繰り返しになります。

// $outputの中身がこんな風になる。
array(2){
	[0] => 
	array(4){
		[0] => "linkA"
		[1] => "tagA"
		[2] => "ploductA"
		[3] => "tokutenA"
	}
	[1] => 
	array(4){
		[0] => "linkB"
		[1] => "tagB"
		[2] => "ploductB"
		[3] => "tokutenB"
	}
}

で、この配列から必要なのを取り出す時はこんな。

foreach ($output as $key => $value) {
	print $value[2].' : '.$value[3]."<br>\n";	
}

/*
出力結果は
ploductA : tokutenA
ploductB : tokutenB
*/

$value[2(添え字)]を変更すれば好きなところを抜けます($value[0]ならlinkAとlinkB)。


絶版後記

array_merge()や、array_merge_recursive()関数も使ったのですが、やりたいことが上手くいかず色々試しました。

何かもっといい方法がありそうなもんですけど...とりあえずできたので良しとしてます。

  • 【タグ】
プログラミングカテゴリの他の記事はこちら。
PHPカテゴリの他の記事はこちら。

スポンサードリンク

news

新作同人誌! MEMORIE(あまんちゅ!イラスト本)の通販 → メロンブックス

イラスト・漫画など活動報告 → イラスト・漫画仕事および同人活動の記録| 絶版あかみる

雑誌掲載されました

絶版あかみるを登録する

follow us in feedly
  • RSS
  • Twitter(@akamiru_)
  • おしらせ

    カテゴリーはページ最下部、月間アーカイブなどは「サイトマップ」にまとめてあります。

    Kindleセール情報

    Google先生に怒られたっぽいのでしばらく削除します。すみません。

    青年コミック(4社選)の3ページ分(人気順)から情報を取得。