配列 関数
PHP Manual

usort

(PHP 4, PHP 5)

usortユーザー定義の比較関数を使用して、配列を値でソートする

説明

bool usort ( array &$array , callable $cmp_function )

この関数は、ユーザー定義の比較関数により配列をその値でソートします。 ソートしたい配列を複雑な基準でソートする必要がある場合、 この関数を使用するべきです。

注意:

比較結果が等しくなるメンバーが複数存在する場合、 ソート後の配列でのそれらのメンバーの並び順は未定義となります。

注意: この関数は、 array パラメータの要素に対して新しいキーを割り当てます。 その際、単純にキーを並べ替える代わりに、 すでに割り当てられている既存のキーを削除してしまいます。

パラメータ

array

入力の配列。

cmp_function

比較関数は、最初の引数と二番目の引数の比較結果を返します。最初の引数のほうが二番目の引数より大きい場合は正の数を、二番目の引数と等しい場合はゼロを、そして二番目の引数より小さい場合は負の数を返す必要があります。

int callback ( mixed $a, mixed $b )
警告

float のような非整数を比較関数が返すと、 その返り値を内部的に integer にキャストして使います。 つまり、0.99 や 0.1 といった値は整数値 0 にキャストされ、 値が等しいとみなされます。

返り値

成功した場合に TRUE を、失敗した場合に FALSE を返します。

変更履歴

バージョン 説明
4.1.0 新しいソートアルゴリズムが導入されました。 cmp_function は、 要素の比較結果が等しい場合にもとの並び順を維持しません。

例1 usort() の例

<?php
function cmp($a$b)
{
    if (
$a == $b) {
        return 
0;
    }
    return (
$a $b) ? -1;
}

$a = array(32561);

usort($a"cmp");

foreach (
$a as $key => $value) {
    echo 
"$key$value\n";
}
?>

上の例の出力は以下となります。

0: 1
1: 2
2: 3
3: 5
4: 6

注意:

もちろん、このような簡単な例では rsort() 関数の方がより適当です。

例2 多次元配列を使用する usort() の例

<?php
function cmp($a$b)
{
    return 
strcmp($a["fruit"], $b["fruit"]);
}

$fruits[0]["fruit"] = "lemons";
$fruits[1]["fruit"] = "apples";
$fruits[2]["fruit"] = "grapes";

usort($fruits"cmp");

while (list(
$key$value) = each($fruits)) {
    echo 
"\$fruits[$key]: " $value["fruit"] . "\n";
}
?>

多次元配列をソートする際には、$a$b は配列の最初のインデックスへの参照を保持しています。

上の例の出力は以下となります。

$fruits[0]: apples
$fruits[1]: grapes
$fruits[2]: lemons

例3 usort() でオブジェクトのメンバ関数を使用する例

<?php
class TestObj {
    var 
$name;

    function 
TestObj($name)
    {
        
$this->name $name;
    }

    
/* これは、比較用の静的関数です */
    
static function cmp_obj($a$b)
    {
        
$al strtolower($a->name);
        
$bl strtolower($b->name);
        if (
$al == $bl) {
            return 
0;
        }
        return (
$al $bl) ? +: -1;
    }
}

$a[] = new TestObj("c");
$a[] = new TestObj("b");
$a[] = new TestObj("d");

usort($a, array("TestObj""cmp_obj"));

foreach (
$a as $item) {
    echo 
$item->name "\n";
}
?>

上の例の出力は以下となります。

b
c
d

例4 usort()クロージャ を使って多次元配列をソートする例

<?php
$array
[0] = array('key_a' => 'z''key_b' => 'c');
$array[1] = array('key_a' => 'x''key_b' => 'b');
$array[2] = array('key_a' => 'y''key_b' => 'a');

function 
build_sorter($key) {
    return function (
$a$b) use ($key) {
        return 
strnatcmp($a[$key], $b[$key]);
    };
}

usort($arraybuild_sorter('key_b'));

foreach (
$array as $item) {
    echo 
$item['key_a'] . ', ' $item['key_b'] . "\n";
}
?>

上の例の出力は以下となります。

y, a
x, b
z, c

参考


配列 関数
PHP Manual