配列 $hiduke[X(0~いくつか)] があり、中には
2007/02/12 や 2002/03/01 1999/12/30 2007/02/14 2007/01/20
などの(年月日が/で区切られた)日付けが順不同で入っています。
↑を例にすると これを
○2007
01月 は 20日
02月 は 12日、14日
○2002
03月 は 01日
○1999
12月 は 30日
のように、『配列にあるものだけ』を
『年、月ごと』に『新しい順』に出力させたいです。
どなたか宜しくお願いします。
例のように表示を実装した例です。
<? $hiduke = array( '2007/02/12', '2002/03/01', '1999/12/30', '2007/02/14', '2007/01/20' ); // 年を降順にするために先頭にデータを付加 for( $i=0 ; $i<count( $hiduke ) ; $i++ ) { $dt = explode( '/', $hiduke[$i] ); array_unshift( $dt, 10000 - $dt[0] ); array_splice( $hiduke, $i, 1, implode( '/', $dt ) ); } sort( $hiduke ); // データを表示 $yy = 0; $mm = 0; $dd = 0; foreach ( $hiduke as $d ) { $dt = explode( '/', $d ); // 年の表示 if ( $yy != $dt[1] ) { if ( $dd != 0 ) print "<br>\n"; $yy = $dt[1]; $mm = 0; print "○$yy<br>\n"; } // 月の表示 if ( $mm != $dt[2] ) { if ( $mm != 0 ) print "<br>\n"; $dd = 0; $mm = $dt[2]; print " {$mm}月 は "; } // 日の表示 if ( $dd != 0 ) print "、"; $dd = $dt[3]; print "{$dd}日"; } print "<br>\n"; ?>
ご参考までに
年は降順で、月と日は昇順という混在だから困っているという事でよろしいでしょうか?
だとすれば「2つの日付を比較して並び替えるかどうかを判断するための自作関数」を作っておいて
usort という関数でソートして、後は foreach で1つ1つ絞り出して適宜処理すればお望みの事が可能になります。
↓ phpのマニュアルのサンプルが参考になります。
http://jp.php.net/manual/ja/function.usort.php
お暇なときにマニュアルを流し読みするだけでもスキルかなりアップしますのでマニュアルにはブックマークをお勧めします。
foreachやifを使い、長い文にするにはできるのですが、
もっとわかりやすくて軽い方法が知りたいです。
1.sort関数で配列を日付順に並べ替える
http://au3.php.net/manual/ja/function.sort.php
2.foreach内で表示する処理を書く
foreach内の処理は、次のようになるでしょう。
(1)要素を、splitで'/'の位置で分解し、年、月、日をそれぞれ$year、$month、$dayに入れる。
次のアドレスに、やり方が書いてあります。
http://au3.php.net/manual/ja/function.split.php
(2)$old_yearと$yearが同じなら、出力しない。
違うなら、"\n○{$year}\n"を出力し、$old_monthと$old_dayをクリア
(3)$old_monthと$monthgaが同じなら、"、"を出力
違うなら、" {$month} 月は"を出力し、$old_dayをクリア
(4)$old_dayと$dayが同じなら、出力しない。
違うなら、"{$day} 日"を出力
(5)$year、$month、$dayをそれぞれ、$old_year、$old_month、$old_dayにコピーする。
これをコーディングすればいいのではないでしょうか?
ありがとうございます。
いろんな回答があったので一通り試してみます。
$year = $month = $day = array(); foreach ($hiduke as $val) { list($year[], $month[], $day[]) = explode("/", $val); } array_multisort($year, SORT_DESC, SORT_STRING, $month, SORT_ASC, SORT_STRING, $day, SORT_ASC, SORT_STRING, $hiduke);
例のように出力するだけであれば、最後の$hidukeは要りません。
シンプルですね
参考にしてみましたがなかなかうまく表示されません。
02月 は 12日、14日 とか・・
例のように表示を実装した例です。
<? $hiduke = array( '2007/02/12', '2002/03/01', '1999/12/30', '2007/02/14', '2007/01/20' ); // 年を降順にするために先頭にデータを付加 for( $i=0 ; $i<count( $hiduke ) ; $i++ ) { $dt = explode( '/', $hiduke[$i] ); array_unshift( $dt, 10000 - $dt[0] ); array_splice( $hiduke, $i, 1, implode( '/', $dt ) ); } sort( $hiduke ); // データを表示 $yy = 0; $mm = 0; $dd = 0; foreach ( $hiduke as $d ) { $dt = explode( '/', $d ); // 年の表示 if ( $yy != $dt[1] ) { if ( $dd != 0 ) print "<br>\n"; $yy = $dt[1]; $mm = 0; print "○$yy<br>\n"; } // 月の表示 if ( $mm != $dt[2] ) { if ( $mm != 0 ) print "<br>\n"; $dd = 0; $mm = $dt[2]; print " {$mm}月 は "; } // 日の表示 if ( $dd != 0 ) print "、"; $dd = $dt[3]; print "{$dd}日"; } print "<br>\n"; ?>
ご参考までに
詳しくありがとうございます。
コピペしただけで動きました><
他の方のも参考にして色々やってみます。
詳しくありがとうございます。
コピペしただけで動きました><
他の方のも参考にして色々やってみます。