回答:
usortを使用してください、これはマニュアルから改造した例です:
function cmp($a, $b) {
return strcmp($a->name, $b->name);
}
usort($your_data, "cmp");
2番目の引数として任意の呼び出し可能オブジェクトを使用することもできます。ここではいくつかの例を示します。
匿名関数の使用(PHP 5.3以降)
usort($your_data, function($a, $b) {return strcmp($a->name, $b->name);});
クラスの中から
usort($your_data, array($this, "cmp")); // "cmp" should be a method in the class
アロー関数の使用(PHP 7.4以降)
usort($your_data, fn($a, $b) => strcmp($a->name, $b->name));
また、数値を比較している場合はfn($a, $b) => $a->count - $b->count
、「比較」機能でうまくいくはずです。
クロージャーを使用するより良い方法がここにあります
usort($your_data, function($a, $b)
{
return strcmp($a->name, $b->name);
});
これはPHPのドキュメントには記載されていませんが、5.3以降のクロージャーを使用している場合は、呼び出し可能な引数を指定できるため、サポートされています。
uasort()
-1 * strcmp($a->name, $b->name);
strcmp($b->name, $a->name)
usort
は、使用する関数をオーバーライドしますが、比較関数は同じです。これを使用protected static
すると、親クラスで一度だけ定義する必要があるメソッドを呼び出す代わりに、クロージャーのコードを複製する必要があります。
整数値をソートする場合:
// Desc sort
usort($array,function($first,$second){
return $first->number < $second->number;
});
// Asc sort
usort($array,function($first,$second){
return $first->number > $second->number;
});
文字列で更新され、同じレジスタに変換することを忘れないでください(上位または下位)
// Desc sort
usort($array,function($first,$second){
return strtolower($first->text) < strtolower($second->text);
});
// Asc sort
usort($array,function($first,$second){
return strtolower($first->text) > strtolower($second->text);
});
usort($array, 'my_sort_function');
var_dump($array);
function my_sort_function($a, $b)
{
return $a->name < $b->name;
}
同じコードがcount
フィールドで使用されます。
詳細usort
:http : //ru2.php.net/usort
ところで、その配列はどこから入手したのですか?データベースからではないことを願っていますか?
$result
にはTRUE
、成功した場合に含まれ、比較はになります$a->name > $b->name
。:)
ORDER BY count
create_function('$a,$b', "return $a->count < $b->count;")
ないため):しかし、機能させることはできません:( usortはパラメーター2が有効なコールバックであることを期待しています
この関数を使用できます(PHPバージョン> = 5.3で動作):
function sortArrayByKey(&$array,$key,$string = false,$asc = true){
if($string){
usort($array,function ($a, $b) use(&$key,&$asc)
{
if($asc) return strcmp(strtolower($a{$key}), strtolower($b{$key}));
else return strcmp(strtolower($b{$key}), strtolower($a{$key}));
});
}else{
usort($array,function ($a, $b) use(&$key,&$asc)
{
if($a[$key] == $b{$key}){return 0;}
if($asc) return ($a{$key} < $b{$key}) ? -1 : 1;
else return ($a{$key} > $b{$key}) ? -1 : 1;
});
}
}
例:
sortArrayByKey($yourArray,"name",true); //String sort (ascending order)
sortArrayByKey($yourArray,"name",true,false); //String sort (descending order)
sortArrayByKey($yourArray,"id"); //number sort (ascending order)
sortArrayByKey($yourArray,"count",false,false); //number sort (descending order)
$a->{$key}
して$b->{$key}
ではなく、$a[$key]
と$b[$key]
私たちはあるように、厳密な特性ではなく、アレイメンバーを扱う、話すが、これはまだ私が探していた答えでした。
ここでのすべての答えの欠点は、静的フィールド名を使用することです。そのため、調整されたバージョンをOOPスタイルで作成しました。ゲッターメソッドを使用していると仮定すると、このクラスを直接使用し、フィールド名をパラメーターとして使用できます。おそらく誰かがそれを便利だと思うでしょう。
class CustomSort{
public $field = '';
public function cmp($a, $b)
{
/**
* field for order is in a class variable $field
* using getter function with naming convention getVariable() we set first letter to uppercase
* we use variable variable names - $a->{'varName'} would directly access a field
*/
return strcmp($a->{'get'.ucfirst($this->field)}(), $b->{'get'.ucfirst($this->field)}());
}
public function sortObjectArrayByField($array, $field)
{
$this->field = $field;
usort($array, array("Your\Namespace\CustomSort", "cmp"));;
return $array;
}
}
並べ替えの基準となるフィールドを動的に決定できる簡単な代替手段:
$order_by = 'name';
usort($your_data, function ($a, $b) use ($order_by)
{
return strcmp($a->{$order_by}, $b->{$order_by});
});
これは、無名関数を許可するClosureクラスに基づいています。PHP 5.3以降で使用できます。
1つのフィールドのみで並べ替える必要がある場合usort
は、この方法が適しています。ただし、複数のフィールドで並べ替える必要がある場合、ソリューションはすぐに乱雑になります。この場合、配列とオブジェクトに対してSQLのようなクエリ構文を実装するYaLinqoライブラリ*を使用できます。それはすべての場合にかなりの構文を持っています:
$sortedByName = from($objects)->orderBy('$v->name');
$sortedByCount = from($objects)->orderBy('$v->count');
$sortedByCountAndName = from($objects)->orderBy('$v->count')->thenBy('$v->name');
ここで'$v->count'
は、の省略形ですfunction ($v) { return $v->count; }
(どちらも使用できます)。これらのメソッドチェーンはイテレータを返しますが、->toArray()
必要に応じて最後に追加することで配列を取得できます。
*私が開発
use function \nspl\a\sorted;
use function \nspl\op\propertyGetter;
use function \nspl\op\methodCaller;
// Sort by property value
$sortedByCount = sorted($objects, propertyGetter('count'));
// Or sort by result of method call
$sortedByName = sorted($objects, methodCaller('getName'));
あなたはこのようなusortを使うことができます
番号で並べ替える場合:
function cmp($a, $b)
{
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
$a = array(3, 2, 5, 6, 1);
usort($a, "cmp");
またはAbc char:
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");