답변:
usort 사용하십시오 . 다음은 매뉴얼에서 수정 된 예입니다.
function cmp($a, $b) {
return strcmp($a->name, $b->name);
}
usort($your_data, "cmp");
두 번째 인수로 모든 호출 가능 항목 을 사용할 수도 있습니다 . 여기 몇 가지 예가 있어요.
익명 함수 사용하기 (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
Btw, 그 어레이를 어디서 얻었습니까? 나는 데이터베이스에서 그것을 원하지 않습니까?
$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 스타일로 조정 버전을 작성했습니다. getter 메소드를 사용한다고 가정하면이 클래스를 직접 사용하고 필드 이름을 parameter로 사용할 수 있습니다 . 아마 누군가가 유용하다고 생각합니다.
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부터 사용할 수 있습니다.
영감을 얻은 덕분에 외부 $ 변환기 매개 변수도 추가해야했습니다.
usort($listable_products, function($a, $b) {
global $translator;
return strcmp($a->getFullTitle($translator), $b->getFullTitle($translator));
});
하나의 필드로만 정렬해야하는 경우 usort
좋은 선택입니다. 그러나 여러 필드를 기준으로 정렬해야하는 경우 솔루션이 빠르게 복잡해집니다. 이 경우 YaLinqo 라이브러리 *를 사용하여 배열 및 객체에 대해 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()
필요한 경우 끝에 추가하여 배열을 얻을 수 있습니다 .
* 나에 의해 개발
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");