質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

3192閲覧

PHPでCSVファイルを配列化した際の追加判定処理

sika

総合スコア52

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2015/09/08 07:30

CSVに入れたデータをPHPで出力する際に
CSVのセル内に入った項目(テキスト)をPHP内で分解して配列に入れた値の中から新たに判定基準の処理を作り
その判定に沿った結果を配列に加えて出力する処理を行いたいです。

【行いたい処理要約】
①.下記内容のCSVのデータをhtmlファイル上に出力するためにPHPで分解
②.CSVのデータを分解処理で多次元配列($rcd)にしたい(※$rcd[1][3]なら「男」が入ってる)
③.多次元配列の中で「性別」項目の各列の内容に判定処理を作る
④.各行に入ってるデータが「男」ならばデータが入った多次元配列($rcd)の末尾にURL(A)が追加される(※$rcd[1][5]に入る予定)
⑤.各行に「女」ならばデータが入った多次元配列($rcd)の末尾にURL(B)が追加される(※$rcd[2][5]に入る予定)
⑥.さらに別の「年齢」項目の各列の内容に判定処理を作る
⑦.各行に入ってるデータが「20」ならば「文字列A」が追加(※$rcd[1][6]に入る予定)
⑧.各行に「15」ならば「文字列B」が追加(※$rcd[2][6]に入る予定)
⑨.上記処理が行われた多次元配列($rcd)に格納された値をHTMLファイルのソース内に埋め込んでブラウザ出力

【CSVファイルのデータ】

| ID | 名前 | 年齢 | 性別 | 住所 | |001|あああ|20|男|東京都…| |002|いいい|15|女|神奈川県…| ・・・・・

【PHPの処理】

<?php //CSVファイルパス $file = 'data.csv'; //CSVファイル読み込み $buf = file_get_contents($file); //一行毎に分割し配列 $lines = explode("\r\n", $buf); foreach ($lines as $line) { //さらに デリミタ「,」毎に分割して、配列に格納 $rcd[] = explode(',',$line); } ech $rcd; ?>

【出力したいHTMLファイルコード】

<div class="aaa"> <ul> <li>名前:<?php echo $rcd[1][1]; ?></li> <li>年齢:<?php echo $rcd[1][2]; ?></li> <li>性別:<?php echo $rcd[1][3]; ?></li> <li>住所:<?php echo $rcd[1][4]; ?></li> <li><a href="<?php echo $rcd[1][5]; ?>"><img src="<?php echo $rcd[1][6]; ?>.jpg" /></a></li> </ul> </div>

②の多次元配列($rcd)に各データを配列に格納するまではできたのですが、
ここからどのようにして各列に範囲を絞って各行に分岐処理を行えば良いかがわかりません。

わかりにくい内容で大変恐縮ですがご教授お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

テストしていないので動かないかもしれませんが、
次のような感じでどうでしょうか。
いずれかの方法で実現できる気がします。

方法1:URLや文字列がそれぞれ固定なら表示時に分岐して表示します。
(わざわざ配列に入れてメモリを使うのももったいないので)

PHP

1<? foreach($rcd as $rcdRowIndex => $rcdRowValue): ?> 2<div class="aaa"> 3 <ul> 4 <li>名前:<?php echo $rcdRowValue[1]; ?></li> 5 <li>年齢:<?php echo $rcdRowValue[2]; ?></li> 6 <li>性別:<?php echo $rcdRowValue[3]; ?></li> 7 <li>住所:<?php echo $rcdRowValue[4]; ?></li> 8 <li><a href="<?php if($rcdRowValue[3] == '男'): ?>URLA<?php else: ?>URLB<?php endif; ?>"><img src="<?php if($rcdRowValue[2] == '20'): ?>文字列A<?php elseif($rcdRowValue[2] == '15'): ?>文字列B<?php else: ?>????<?php endif; ?>.jpg" /></a></li> 9 </ul> 10</div> 11<? endforeach; ?>

方法2:URLや文字列がそれぞれ異なるなら配列に入れてから表示します。
表示部分は質問にあるHTMLをループする感じです。

PHP

1foreach ($lines as $line) { 2 //さらに デリミタ「,」毎に分割して、配列に格納 3 $lineArr = explode(',',$line); 4 if($lineArr[3] == '男'){ 5 $lineArr[5] = 'URLA'; 6 } else { 7 $lineArr[5] = 'URLB'; 8 } 9 if($lineArr[2] == '20'){ 10 $lineArr[6] = '文字列A'; 11 if($lineArr[2] == '15'){ 12 $lineArr[6] = '文字列B'; 13 } else { 14 // 上の場合も同じですが、20や15じゃない場合の処理を考慮する必要はありませんか? 15 $lineArr[6] = '???'; 16 } 17 18 $rcd[] = $lineArr; 19}

投稿2015/09/08 07:53

notable

総合スコア415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sika

2015/11/12 03:00

返答が遅れてしまい誠に申し訳ございませんでした。 方法2で無事対応できました!本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問