PHPでバージョン番号が格納された配列をソートする

新年明けまして、おめでとうございます。本年もどうぞよろしくお願いします
2018年最初の記事です。今回はバージョン番号が格納されている配列をソートする方法です

主題

<?php
$array = ['1.0.0', '2.0.0', '3.0.0', '1.1.0', '1.1.0-dev'];
sort($array);
print_r($array);

いきなりサンプルコード乗っけてみました。これを実行した時の結果は以下のようになります

Array
(
    [0] => 1.0.0
    [1] => 1.1.0
    [2] => 1.1.0-dev
    [3] => 2.0.0
    [4] => 3.0.0
)

“-dev”をつけたものがつけていないものより上に来てしまっています。これを解消します

方法

すでにソートするものはgistにあげています。これを実用性のあるものにするには少し手を加える必要はあるでしょうが

ここでは VersionSort というクラスを作り、public な昇順と降順の関数と private な callable関数をどちらも static で宣言しています
callableの中で version_compare というphpに元からあるバージョン比較の関数を用いています
実際にアプリケーションにこれを組み込むなら Versionクラスなんかを作ってコンストラクタでクラスプロパティにリストを格納させてそのクラスでソートする関数を宣言するとかかなといった感じ。そうする時は static を外すことになると思います。callable から static を外す時はソートする関数で以下のように書き換える必要があります

usort($versionArray, array($this, 'descendingCompare'));

あとは開発中というか pre-release版を除外するオプションを付け加えないとダメかなと思います

まぁこんな感じで。これ書こうと思ったのは adminer っていう php のデータベース管理アプリをGitHubからクローンしてコンパイルした時に adminer-4.4.0.php みたいなファイルが生成されるんですけどそのバージョンを消したり index.php から require するのに毎回書き換えるとかめんどくさいのでバージョンをリスト化してしまおうみたいな安直な発想から必要に迫られたので書きました。開発中のバージョンは”-dev”がつくことがあるのでそれをどうしようかといった感じで。実際に使ってる状態が以下のツイート。命名規則がないぐちゃぐちゃ具合ではある……

というわけで実用に耐えうるものではないですがちょっとした tips みたいなものでした。ではでは

Leave a Reply

Your email address will not be published. Required fields are marked *