name
やcount
のように、このオブジェクトの配列をそのフィールドの1つで並べ替えるにはどうすればよいですか。
Array
(
[0] => stdClass Object
(
[ID] => 1
[name] => Mary Jane
[count] => 420
)
[1] => stdClass Object
(
[ID] => 2
[name] => Johnny
[count] => 234
)
[2] => stdClass Object
(
[ID] => 3
[name] => Kathy
[count] => 4354
)
....
usort を使用してください、これはマニュアルから改作した例です:
function cmp($a, $b)
{
return strcmp($a->name, $b->name);
}
usort($your_data, "cmp");
コメントからインポートされた編集:
クラスの内側から配列をソートしていて、ソート関数cmp
もクラスの内側で定義されている場合は、次のようにします。
usort($your_data, array($this, "cmp"))
クロージャを使ったよりよい方法
usort($your_data, function($a, $b)
{
return strcmp($a->name, $b->name);
});
これはPHPのドキュメントには含まれていませんが、呼び出し可能な引数を提供できるところで5.3以降のクロージャがサポートされている場合は注意してください。
あなたがphp oopを使っているなら、あなたは以下に変更する必要があるかもしれません:
public static function cmp($a, $b)
{
return strcmp($a->name, $b->name);
}
//in this case FUNCTION_NAME would be cmp
usort($your_data, array('YOUR_CLASS_NAME','FUNCTION_NAME'));
整数値をソートしたい場合は、
// 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
ところで、あなたはどこからその配列を入手しましたか?私はデータベースからではないと思いますか?
この関数を使うことができます(PHP Version> = 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)
このようにusort
を使うことができます:
usort($array,function($first,$second){
return strcmp($first->name, $second->name);
});
ここですべてが失敗した場合は別の解決策があります。
$names = array();
foreach ($my_array as $my_object) {
$names[] = $my_object->name; //any object field
}
array_multisort($names, SORT_ASC, $my_array);
return $my_array;
ここでのすべての答えのマイナス面は、それらが static フィールド名を使用しているということですので、私は調整バージョンをOOPスタイルで書きました。 getterメソッドを使用していると仮定すると、このClassを直接使用でき、 フィールド名をパラメータ として使用できます。おそらく誰かがそれを役に立つと思います。
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});
});
これは クロージャクラス に基づいています。これは無名関数を可能にします。 PHP 5.3以降で利用可能です。
インスピレーションをありがとう、私は外部の$ translatorパラメータも追加しなければなりませんでした
usort($listable_products, function($a, $b) {
global $translator;
return strcmp($a->getFullTitle($translator), $b->getFullTitle($translator));
});
これをCodeigniterの内部で使用している場合は、以下のメソッドを使用できます。
usort($jobs, array($this->job_model, "sortJobs")); // function inside Model
usort($jobs, array($this, "sortJobs")); // Written inside Controller.
@ smooney提案をお寄せいただきありがとうございます。本当に助かります。
これは私がユーティリティクラスのために持っているものです
class Util
{
public static function sortArrayByName(&$arrayToSort, $meta) {
usort($arrayToSort, function($a, $b) use ($meta) {
return strcmp($a[$meta], $b[$meta]);
});
}
}
あれを呼べ:
Util::sortArrayByName($array, "array_property_name");
1つのフィールドだけでソートする必要がある場合は、usort
が適しています。ただし、複数のフィールドで並べ替える必要がある場合、解決策はすぐに面倒になります。この場合、 YaLinqo library *を使用できます。これは、配列およびオブジェクトに対してSQLのようなクエリ構文を実装します。それはすべての場合にきれいな構文を持っています:
$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()
を追加することで配列を取得できます。
*私が開発した
最も簡単な方法は
return array_values(array_sort($array, function ($value) {
return $value->key;
}));
キーを注文したい「キー」に置き換えます。
日付を並べ替えたい場合
usort($threads,function($first,$second){
return strtotime($first->dateandtime) < strtotime($second->dateandtime);
});
Nspl から sorted functionを使用できます。
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");
詳細を参照してください: https://www.php.net/manual/en/function.usort.php