【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』という感じです。よさそうなんで、さっそく試してみましょうか。
array_multisort(PHPマニュアル)
https://www.php.net/manual/ja/function.array-multisort.php
array_column(PHPマニュアル)
https://www.php.net/manual/ja/function.array-column.php
array_map(PHPマニュアル)
https://www.php.net/manual/ja/function.array-map.php
strtotime(PHPマニュアル)
https://www.php.net/manual/ja/function.strtotime.php
記事xml内の日付項目でソートした状態で一覧を取るコード・ポイント
今回のコード(一部分です)。フロントのコントローラーは別にあって、getsimpleのテーマ上でxmlを取って一覧を出す部分です。まずglobでxmlファイル取って、$data_indexという配列を作り、getsimple組み込みのgetXmlで取って格納します。ポイントは・・・
$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
【タグ】- array_multisort(PHP), array_slice(PHP), GetSimple-CMSをヘッドレスにするシリーズ, PHP