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

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

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

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

Q&A

解決済

4回答

256閲覧

PHP:年月の文字列(2016年8月など)を並べ替えるために数値化したい

igaiga

総合スコア144

PHP

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

0グッド

0クリップ

投稿2017/09/16 02:09

編集2017/09/16 02:47

文字列のまま並べ替えをすると以下のように並んでしまいました。
wordpressのget_postsで並び替えたいので、元のデータを成形しなおさないといけないかと思っています。

2016年8月
2016年7月
2016年5月
2016年2月
2016年12月

並び変えるために数値に置き換えたいのですが、変換用の関数等あるのでしょうか。
また2016-12のようにしても数値として扱ってくれるのでしょうか。
それとも 2016×12+12=24204 といった感じで月数に変換したほうが良いのか、、、
一般的なやり方があればご教授いただければ幸いです。
よろしくお願いいたします。

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

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

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

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

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

maisumakun

2017/09/16 02:19

元データから「2016年8月」という形となっているのでしょうか、それとも別な形式からこのような形に変換しているのでしょうか(後者の場合、変換前のデータを並べ替えたほうが速い可能性もあります)。
igaiga

2017/09/16 02:23

元データが「2016年8月」という形になっています。1000件くらいあるので手作業ではなく、一括で変換したいと思っています。よろしくお願いします。
kei344

2017/09/16 18:47

「元データ」はカスタムフィールド内ですか?それとも他の項目ですか?
igaiga

2017/09/18 00:10

カスタムフィールド内です。
guest

回答4

0

usort()を使えば、指定した基準でソートを掛けられます(リファレンス)。

php

1usort($arr, function($first, $second){ 2 $regex = '/[年月]/u'; 3 // 配列の0要素目が年、1要素目が月 4 $first_arr = preg_split($regex, $first); 5 $second_arr = preg_split($regex, $second); 6 $year_diff = $first_arr[0] - $second_arr[0]; 7 if($year_diff) return $year_diff; 8 return $first_arr[1] - $second_arr[1]; 9});

paiza.ioで実働させたサンプル

投稿2017/09/16 02:31

maisumakun

総合スコア145184

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

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

igaiga

2017/09/16 02:42

後出しで大変申し訳ございません。wordpressのget_postsで並び替えたいので、元のデータを成形しなおさないといけないかと思っています。 usortは配列の並び替えという認識でよいでしょうか。
maisumakun

2017/09/16 02:44

そうですね、配列の並べ替え用の関数です。
guest

0

ベストアンサー

一括置換のためのプラグインがあるので、それを利用されてはいかがでしょう。
※ 置換にデータベースのバックアップを採ることを強く推奨します。

【Search Regexプラグイン(記事やコメント内容を一括置換) - WordPressプラグインの一覧】
https://www.adminweb.jp/wordpress-plugin/list/index27.html

【WordPress の記事内容を一括で置換できるプラグイン Search Regex】
https://nj-clucker.com/wordpress-plug-in-search-regex/


未検証ですが、下記方法であれば取得の際に未加工でソートできるかもしれません。

【WordPressのカスタムフィールドを日付としてソートしたい - Life is Really Short, Have Your Life!!】
http://aroundthedistance.hatenadiary.jp/entry/2014/02/03/160822

【カスタムフィールドに入れた日付順に記事一覧を並べ替える方法 | TechMemo】
http://techmemo.biz/wordpress/orderby-custom-field/

【【WordPress】カスタムフィールドの日付で期間内のスケジュールだけを並べ替えて表示する │ ノラWEB屋 野良人(のらんど)】
http://norando.net/wp-meta_compare/

投稿2017/09/18 01:21

kei344

総合スコア69407

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

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

igaiga

2017/09/18 06:41

「カスタムフィールドに入れた日付順に記事一覧を並べ替える方法」を試してみましたが、動作しませんでした。フォーラムの類似の質問を見るとY-m-dの形式にしないとダメかもしれないようなことが書いてあったのでそのせいかもしれません。 置換でやってみます。ありがとうございました。
guest

0

年と月だけだと文字列をsplitして数値化するという方法でも良いような気がしますが、日時の値にちゃんと変換するなら、こんな感じで。

PHP

1date_default_timezone_set("Asia/Tokyo"); 2$a=date_create_from_format("Y年n月","1998年2月");

ソートはめんどくさい。

PHP

1date_default_timezone_set("Asia/Tokyo"); 2 3$foo = array("2000年1月","1980年10月","1980年2月","1980年1月"); 4 5var_dump($foo); 6 7array_multisort(array_map(function($x) { 8 return date_create_from_format("Y年n月",$x) ; 9 },$foo), SORT_ASC, $foo); 10 11var_dump($foo);

投稿2017/09/16 18:40

otn

総合スコア84557

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

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

igaiga

2017/09/18 05:43

ありがとうございます。そのまま入れてみましたが、こんな感じで出ました。 array(4) { [0]=> string(11) "2000年1月" [1]=> string(12) "1980年10月" [2]=> string(11) "1980年2月" [3]=> string(11) "1980年1月" } array(4) { [0]=> string(11) "1980年1月" [1]=> string(11) "1980年2月" [2]=> string(12) "1980年10月" [3]=> string(11) "2000年1月" }
guest

0

こんな感じで数値にすれば良くないですか?

$meta = get_post_meta( get_the_ID(), 'カスタムフィールド' ,false ); $meta = preg_replace( '/年(\d)月/', '0\1' , $meta ); $meta = preg_replace( '/年(\d{2})月/', '\1' , $meta );
Array ( [0] => 201602 [1] => 201605 [2] => 201607 [3] => 201608 [4] => 201612 )

投稿2017/09/18 06:52

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

igaiga

2017/09/18 06:55

ありがとうございます。このほうが簡単そうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問