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

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

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

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

Smarty

Smartyは、PHPアプリケーションで使用されるテンプレートエンジンです。

Q&A

解決済

1回答

2513閲覧

PHPのsmartyで件数指定

HiroakiYamada

総合スコア8

PHP

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

Smarty

Smartyは、PHPアプリケーションで使用されるテンプレートエンジンです。

0グッド

0クリップ

投稿2017/06/05 10:20

北海道や東北など、各地域ごとに女性と男性が交互に6件表示させるということをやりたいです。
Smartyで地域ごとの件数を全件取得できてはいるのですが、6件表示させるというのができないです。
以下にコードを載せますので、わかる方いらっしゃいましたらよろしくお願いします。

php

1function getNewList(){ 2 // エリアを取得 3 $area_list = array(); 4 for($i = 0; $i <= 46; $i++){ 5 $xml_url = API_AREA . '?appid=' . APPID . '&code=' . $i; 6 $xml_data = simplexml_load_file($xml_url); 7 foreach($xml_data as $key=>$value){ 8 $code = (integer)$value->code; 9 $area_list[$code]['name'] = (string)$value->name; 10 $area_list[$code]['parent_area_code'] = (integer)$value->parent_area_code; 11 } 12 } 13 14 // 男性3件 15 //$xml_url_man = API_HAPPY . '?appid=' . APPID . '&limit=' . 3 . '&sex=' . 0; 16 $xml_url_man = API_HAPPY . '?appid=' . APPID .'&sex=' . 0; 17 $xml_data_man = simplexml_load_file($xml_url_man); 18 $arr = json_decode(json_encode($xml_data_man), true); 19 foreach($arr as $key=>$value){ 20 for($i = 0; $i < count($value); $i++){ 21 $date = date('Y年n月j日', strtotime($value[$i]['date'])); 22 $week = date('w', strtotime($value[$i]['date'])); 23 $new_data_m[$i]['date'] = mb_substr($date, 5, 6, 'utf-8'); 24 $new_data_m[$i]['week'] = $GLOBALS['WEEK'][$week]; 25 $new_data_m[$i]['sex'] = (integer)$value[$i]['sex']; 26 27 $code = $value[$i]['code']; 28 if(array_key_exists($value[$i]['code'], $area_list)){ 29 $new_data_m[$i]['area'] = $area_list[$code]['name']; 30 $new_data_m[$i]['parent_area_code'] = $area_list[$code]['parent_area_code']; 31 } 32 } 33 } 34 35 // 女性3件 36 $xml_url_woman = API_HAPPY . '?appid=' . APPID . '&sex=' . 1; 37 $xml_data_woman = simplexml_load_file($xml_url_woman); 38 $arr = json_decode(json_encode($xml_data_woman), true); 39 40 foreach($arr as $key=>$value){ 41 for($i = 0; $i < count($value); $i++){ 42 $date = date('Y年n月j日', strtotime($value[$i]['date'])); 43 $week = date('w', strtotime($value[$i]['date'])); 44 $new_data_w[$i]['date'] = mb_substr($date, 5, 6, 'utf-8'); 45 $new_data_w[$i]['week'] = $GLOBALS['WEEK'][$week]; 46 $new_data_w[$i]['sex'] = (integer)$value[$i]['sex']; 47 $code = $value[$i]['code']; 48 if(array_key_exists($value[$i]['code'], $area_list)){ 49 $new_data_w[$i]['area'] = $area_list[$code]['name']; 50 $new_data_w[$i]['parent_area_code'] = $area_list[$code]['parent_area_code']; 51 } 52 } 53 } 54 return array($new_data_w, $new_data_m); 55 }

php

1function executeIndex () { 2 $this->new_list = $this->getNewList(); 3 4 return $this->render('index'); 5}

html

1 <ul class="report_list"> 2 {foreach from=$new_list|smarty:nodefaults item='array'} 3 {foreach from=$array|smarty:nodefaults key=key item='data'} 4 {if $data.parent_area_code == 10001 || $data.parent_area_code == 10005 } 5 <li {if $data.sex == 1} class="woman" {else} class="man" {/if}> 6 {$data.date}{$data.week}&emsp;{$data.area}会場 7 <h3>{if $data.sex == 1}女性{else}男性{/if}</h3> 8 <p>本文</p> 9 <a href="/happy/#■■ID■■">続きを見る</a> 10 </li> 11 {/if} 12 {/foreach} 13 {/foreach} 14 </ul> 15

PHPでは外部ファイルをAPIとして読み込んで処理をしております。

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

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

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

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

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

guest

回答1

0

ベストアンサー

何順で表示するか決める必要があります
ランダムでよいのでしょうか?
男女各6件以上ない場合はいる人だけでよいのでしょうか?
交互とは男女どちらが先になるのでしょうか?

きちんとSQLとして処理するにはランク付け処理をして
ランクが6以上のユーザーを抜き出せばよいかと思います。

sample

ちょっとうまく伝わらないようなので例示します
前回SQLはわすれてください

元データ
※areaはとりあえず2種としてあります、sexは仮に1=男、2=女とします

SQL

1create table tbl(uid int unique,uname varchar(30),area int,sex tinyint); 2insert into tbl values 3(1,'aaa',1,1), 4(2,'bbb',1,1), 5(3,'ccc',1,2), 6(4,'ddd',1,2), 7(5,'eee',1,2), 8(7,'fff',1,2), 9(8,'ggg',1,1), 10(9,'hhh',1,2), 11(10,'iii',2,1);

抽出
※area=1に対して、idが若い順に女性・男性を交互に3人ずつ表示します

SQL

1select uid,uname,area,sex 2,(select count(*)+1 from tbl as t2 3where t1.area=t2.area and t1.sex=t2.sex and t1.uid>t2.uid 4) as rank 5from tbl as t1 6where area=1 7having rank<=3 8order by rank asc,sex desc 9

結果

uidunameareasexrank
3ccc121
1aaa111
4ddd122
2bbb112
5eee123
8ggg113

投稿2017/06/05 11:31

編集2017/06/06 02:17
yambejp

総合スコア114574

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

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

HiroakiYamada

2017/06/06 01:28 編集

ご回答ありがとうございます。 すいません、説明が不足していました。 SQLは、SELECT area_num,publish_date,area_code,sex,body FROM exeo_happy WHERE switch = TRUE AND sex = ? ORDER BY publish_date DESC で投稿日の降順に表示させます。 表示は女性、男性の順で最大で6件表示させます。6件未満のときはいる人だけでいいです。 ご回答を参考に、SELECT area_num,publish_date,area_code,sex,body, (SELECT COUNT(*)-1 FROM exeo_happy) AS RANK FROM exeo_happy HAVING RANK<=6 ORDER BY area,RANK,sex で実行してみたのですが、ERROR: 列"rank"は存在しません at character 117と表示され うまくいきませんでした。
yambejp

2017/06/06 02:17

ちょっとわかりづらそうなのでsampleつけておきました
HiroakiYamada

2017/06/12 02:01

返信がおそくなりました。 仕様を確認しましたら、男女交互でなくてもよかったみたいです^^; 丁寧なご回答でしたので、BAにさせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問