icon
Let's create! WordPressサイト制作とメンテ/エラー対応から、PHP/CSS/javascriptプログラミング、動画・音・イラスト等制作まで扱うコラム

【PHP/getsimple改造CMS作るシリーズ】記事xml内の日付項目でソートした状態で一覧を取りたい(array_map・array_multisort・array_column)

更新: 2024/05/13 2183文字

今回は、最近管理人が作っていた『getsimple改造CMS』で、『記事データとしてxmlが格納されているけど、それを名前順ではなく、内部の日付項目でソートしたい』という話題です。もともと日付ソートされてない印象だったので、解決できれば使いやすさが一気にあがりそうです。早速内容を見ていきましょう。

解決したい点~記事xmlが名前順で格納されており、一覧も日付順に出ない

getsimpleはフラットファイル型なので、データベースは無く、xmlで保存されています。まずは、記事フォルダに格納されている、個別ブログ記事のxmlファイルを見てみましょう。更新時にpubDateの項目に日付が入ります。 例えば『blog-0004-2023.xml』のファイルでは、pubDateが2023年1月になっています

他のファイルも見てみます。 『blog-20240509newlunch』は最近作ったもので、pubDateが2024年5月です

で、ファイル名順になっているので、pubDate順にはなりません。

この状態はPCでのファイル表示だけでなく・・ 管理画面でもこの並びで、xml内のpubDateでソートはされていません。『blog-0004-2023.xml』が一番下に来てほしいです。この状態でフロントで何も考えずに一覧を出してしまうと・・・

ファイル名順なので、日付がバラバラになります。データベースとかだとラクなんですけど、xmlファイル内の日付項目でソート出力できないでしょうか。

今回つかえそうなPHP~array_multisort/array_map/array_column/strtotime

そういうわけで、PHPマニュアルとかを検索して、使えそうなファンクションを探しました。ポイントは『配列ソート・配列全体に時間形式変換をかける』です。ありましたねー。

ロジックとしては『まずxmlをとったら、array_columnで日付を集めてarray_mapでフォーマット変換(文字列で出てきたから)、その日付の値でarray_multisort』という感じです。よさそうなんで、さっそく試してみましょうか。

記事xml内の日付項目でソートした状態で一覧を取るコード・ポイント

今回のコード(一部分です)。フロントのコントローラーは別にあって、getsimpleのテーマ上でxmlを取って一覧を出す部分です。まずglobでxmlファイル取って、$data_indexという配列を作り、getsimple組み込みのgetXmlで取って格納します。ポイントは・・・

$dateArrayStr = array_column($data_index, 'pubDate');
$dateArray= array_map("strtotime",$dateArrayStr);
array_multisort($dateArray , SORT_DESC, $data_index);

上記の部分です。array_columnでpubDateを抜いて日付の配列を作る→array_mapのコールバックで日付型に変換する→その日付の値でarray_multisortをかける、という流れになります。あとはarray_sliceで5件切り取るか、全件返すか、というところです。

表示例

上記のプログラムを実行してみたところ・・ こんな感じで、pubDateの日付順にソートすることができました(フロントに出てる日付はpubDateです)。

あとがき・まとめ

  • 日付の項目だけとか、特定の項目を抜き出すときはarray_column
  • 配列の各要素にファンクション適応させたいときはarray_map
  • 配列のソートにはarray_multisort

まとめると、こんなところでしょうか。配列ファンクションの話ばかりになりましたが、使いこなせば便利な気がします。フロントだけでしたが、理屈がわかれば管理画面でも使えそうです。


【カテゴリ】- PHP
【タグ】- , , ,

関連記事