4

このバージョン値の配列を並べ替えるにはどうすればよいですか?

$available_databases = array(
    "4.0.1",
    "trunk",
    "branch",
    "4.1.0",
    "4.0.3"
);

結果は次のようになります

4.1.0
4.0.3
4.0.1
branch
trunk
4

4 に答える 4

5

usort関数を使用する必要があります。

$isVersion = function($a) { return is_numeric( str_replace('.', '', $a) ); };
$sortFunction = function($a, $b) use($isVersion) { 
    if( $isVersion($a) && $isVersion($b) ) { 
        return version_compare($b, $a); // reversed for your proper ordering
    } elseif( $isVersion($a) ) { 
        return -1;
    } elseif( $isVersion($b) ) { 
        return 1;
    } else { 
        return strcasecmp($a, $b);
    }
};

usort($yourArray, $sortFunction);

usort関数を使用すると、独自のカスタム比較コールバックを使用できます。必要なロジックを使用してここに1つ作成しました。比較可能な両方のアイテムがバージョンである場合、version_compare降順が必要なため、パラメーターを逆にしてそれらを比較するために使用します。2番目の比較可能な項目が文字列であり、最初の項目がバージョンである場合、バージョンは文字列より「低い」と言われ、その逆も同様です。両方の項目が文字列の場合、strcasecmp比較機能を使用して適切な順序を決定します。

使用例:コードパッド

于 2012-08-31T02:27:42.910 に答える
2

PHPの組み込み配列操作などを使用して、多くの手間のかかる作業を行うことができるため、明らかな複雑さの多くを取り除くことができます。

$names = preg_grep('/^\D/', $arr);
$versions = preg_grep('/^\d/', $arr);

usort($versions, 'version_compare');
usort($names, 'strcasecmp');

$sorted = array_merge(array_reverse($versions), $names);
于 2012-09-02T04:19:15.327 に答える
1

これは、いくつかの配列関数といくつかのループを使用して実行できます。

例:

<?php
$arr = array("4.0.1", "trunk", "branch", "4.1.0", "4.0.3", "1.2", "1.31", "1.10", "1.4.5");
natsort($arr);
$count = count($arr);
$alpha = array();
$new_arr = array();
for($i = 0; $i < $count; $i++) {
    if(!is_numeric(str_replace('.', '', $arr[$i]))) {
        $alpha[] = $arr[$i];
    } else {
        $new_arr[] = $arr[$i];
    }
    $arr[$i] = null;
}
rsort($new_arr);
sort($alpha);
$new_arr = array_merge($new_arr, $alpha);
var_dump($new_arr);
?>

こちらのデモ。

于 2012-08-31T02:42:05.227 に答える
0

version_compare()評価を逆にするだけです。

コード:(デモ

$array = ["4.0.1", "trunk", "branch", "4.1.0", "4.0.3"];

usort($array, function($a, $b) {
    return version_compare($b, $a);
});

var_export($array);

出力:

array (
  0 => '4.1.0',
  1 => '4.0.3',
  2 => '4.0.1',
  3 => 'branch',
  4 => 'trunk',
)

PHP7.4から、矢印関数の構文を使用できるようになりました。(デモ

usort($array, fn($a, $b) => version_compare($b, $a));
于 2019-12-23T04:18:33.973 に答える