下記のようなcsvファイルがあり、
csv
1seq,house,booth 21,家A,1 32,家A,6 43,家A,3 54,家B,1 65,家B,2
phpで
・「家A」のみを抽出し
・「booth」で昇順にし、
・「booth」を連番となるようにして下記のように表示させたいです。
HTML
1<ul> 2 <li>1:家A</li> 3 <li>2:無し</li> 4 <li>3:家A</li> 5 <li>4:無し</li> 6 <li>5:無し</li> 7 <li>6:家A</li> 8</ul>
データ内に「booth」のデータがない場合(※今回では2,4,5のような場合)でも「無し」と表示されるようにしたいのですが、その部分が分かりません。
下記のように記述してみたのですが、
php
1function sampleFunc () { 2 3 // ローケルを設定 4 setlocale(LC_ALL, 'ja_JP.UTF-8'); 5 $filename = FILEPATH; 6 $tempCSV = file_get_contents($filename); 7 $tempCSV = mb_convert_encoding($tempCSV, 'UTF-8', 'SJIS'); 8 $fp = tmpfile(); 9 fwrite($fp, $tempCSV); 10 rewind($fp); 11 12 $lineCount = 0; 13 // 1行ずつ読み込み 14 while ($arr = fgetcsv($fp)) { 15 // 空行を除外 16 if (!array_diff($arr, array(''))) { 17 continue; 18 } 19 // 1行目をスキップ 20 if ($lineCount === 0) { 21 $lineCount++; 22 continue; 23 } 24 25 list ($seq, $house, $booth) = $arr; 26 27 $datas[] = array( 28 'seq'=>$arr[0], 29 'house'=>$arr[1], 30 'booth'=>$arr[2] 31 ); 32 } 33 34 // ファイルを閉じる 35 fflush ($fp); 36 flock($fp, LOCK_UN); 37 fclose($fp); 38 39 // floorの順番にソート 40 sortArrayByKey($datas, "booth"); 41 42 // HTML部分を表示 43 echo "<ul>"; 44 foreach ($datas as $line) { 45 // 家Aなら 46 if ($line["house"] === "家A") { 47 echo "<li>".$line["booth"].":".$line["house"]."</li>\n"; 48 } 49 } 50 echo "</ul>"; 51 52} 53 54// 多次元配列をソート 55function sortArrayByKey( &$array, $sortKey, $sortType = SORT_ASC ) { 56 $tmpArray = array(); 57 foreach ( $array as $key => $row ) { 58 $tmpArray[$key] = $row[$sortKey]; 59 } 60 array_multisort( $tmpArray, $sortType, $array ); 61 unset( $tmpArray ); 62}
実行すると下記のように表示されてしまいます。
HTML
1<ul> 2<li>1:家A</li> 3<li>3:家A</li> 4<li>6:家A</li> 5</ul>
解決方法を教示いただけますと幸いです。
よろしくお願いいたします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/07 09:45
2016/12/07 11:29
2016/12/07 13:49