人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【PHP】プログラミング、知恵を貸してください。

配列 $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日

のように、『配列にあるものだけ』を
『年、月ごと』に『新しい順』に出力させたいです。

どなたか宜しくお願いします。

●質問者: mig
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:12月 1月 3月 PHP けが
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● kn1967
●20ポイント

年は降順で、月と日は昇順という混在だから困っているという事でよろしいでしょうか?

だとすれば「2つの日付を比較して並び替えるかどうかを判断するための自作関数」を作っておいて

usort という関数でソートして、後は foreach で1つ1つ絞り出して適宜処理すればお望みの事が可能になります。


↓ phpのマニュアルのサンプルが参考になります。

http://jp.php.net/manual/ja/function.usort.php

お暇なときにマニュアルを流し読みするだけでもスキルかなりアップしますのでマニュアルにはブックマークをお勧めします。

◎質問者からの返答

foreachやifを使い、長い文にするにはできるのですが、

もっとわかりやすくて軽い方法が知りたいです。


2 ● nandedarou
●20ポイント

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にコピーする。

これをコーディングすればいいのではないでしょうか?

◎質問者からの返答

ありがとうございます。

いろんな回答があったので一通り試してみます。


3 ● vector
●20ポイント
$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日 とか・・


4 ● Mook
●40ポイント ベストアンサー

例のように表示を実装した例です。

<?
 $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 "&nbsp;&nbsp;{$mm}月 は ";
 }
 // 日の表示
 if ( $dd != 0 ) print "、";
 $dd = $dt[3];
 print "{$dd}日";
 }
 print "<br>\n";
?>

ご参考までに

◎質問者からの返答

詳しくありがとうございます。

コピペしただけで動きました><

他の方のも参考にして色々やってみます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ