개체 배열을 속성별로 정렬합니다.
중 하나요?name
★★★★★★★★★★★★★★★★★」count
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");
두 번째 인수로 임의의 콜 가능을 사용할 수도 있습니다.다음은 몇 가지 예입니다.
-
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
-
usort($your_data, fn($a, $b) => strcmp($a->name, $b->name));
숫자와 때 '비교할 fn($a, $b) => $a->count - $b->count
"compare" 함수가 적절한 기능을 수행하거나, 같은 작업을 수행하는 다른 방법을 원할 경우 PHP 7부터 다음과 같이 우주선 연산자를 사용할 수 있습니다.fn($a, $b) => $a->count <=> $b->count
.
클로저를 사용하여 더 좋은 방법을 소개합니다.
usort($your_data, function($a, $b)
{
return strcmp($a->name, $b->name);
});
이는 PHP 문서에는 없지만 5.3 이상의 closure를 사용하는 경우 호출 가능한 인수를 제공할 수 있습니다.
정수값을 정렬하는 경우:
// 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);
});
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'));
usort($array, 'my_sort_function');
var_dump($array);
function my_sort_function($a, $b)
{
return $a->name < $b->name;
}
같은 코드가 에 있습니다.count
syslog.syslog.syslog.
것은 usort
: http://ru2.php.net/usort
그나저나, 그 배열은 어디서 났어?데이터베이스에서 안 나왔으면 좋겠는데?
다음 기능을 사용할 수 있습니다(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)
모든 것이 실패했을 경우는, 다음의 해결 방법이 있습니다.
$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;
하시면 됩니다.usort
이렇게요.
usort($array,function($first,$second){
return strcmp($first->name, $second->name);
});
날짜를 정렬하려면
usort($threads,function($first,$second){
return strtotime($first->dateandtime) < strtotime($second->dateandtime);
});
이 모든 답변의 단점은 정적 필드 이름을 사용하기 때문에 OOP 스타일로 수정 버전을 작성했습니다.getter 메서드를 사용하는 것으로 가정하면 이 클래스를 직접 사용하고 필드 이름을 매개 변수로 사용할 수 있습니다.아마 누군가 유용하다고 생각할거야.
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;
}
}
로컬 기반 문자열 비교가 필요한 경우,strcmp
.
처음 사용할 때 기억하기LC_COLLATE
이치노
usort($your_data,function($a,$b){
setlocale (LC_COLLATE, 'pl_PL.UTF-8'); // Example of Polish language collation
return strcoll($a->name,$b->name);
});
정렬의 기반이 되는 필드를 동적으로 결정할 수 있는 간단한 대안:
$order_by = 'name';
usort($your_data, function ($a, $b) use ($order_by)
{
return strcmp($a->{$order_by}, $b->{$order_by});
});
이는 익명 함수를 허용하는 Closure 클래스를 기반으로 합니다.PHP 5.3 이후부터 이용 가능합니다.
Codeigniter 내부에서 이것을 사용하고 있는 경우는, 다음의 방법을 사용할 수 있습니다.
usort($jobs, array($this->job_model, "sortJobs")); // function inside Model
usort($jobs, array($this, "sortJobs")); // Written inside Controller.
@rmooney 제안 감사합니다.정말 도움이 돼요.
영감을 주셔서 감사합니다.외부 $translator 파라미터도 추가해야 했습니다.
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'));
이게 제가 가지고 있는 유틸리티 클래스입니다.
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");
이렇게 쓸 수 있어요.
번호순으로 정렬하는 경우:
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 문자:
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
$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($array, build_sorter('key_b'));
사용...
$array_list = [
"Apple" => 2,
"Pear" => 1,
"Orange" => 5,
"Lemon" => 1,
"Strawberry" => 2,
"Banana" => 3
];
function cmp($a, $b) {
return $b - $a;
}
$ao = new ArrayObject($object);
$ao->uasort('cmp');
print_r(json_encode($ao));
안녕!!!
하려면 , 「」의 합니다.array_column()
★★★★★★★★★★★★★★★★★」array_multisort()
한 가지 합리적인 방법입니다.데모
array_multisort(array_column($array, 'count'), $array);
또는 에만 문의할 수 있습니다.usort()
이 시나리오에서는 반복을 줄이기 위해 우주선 운영자와 함께 작업합니다.데모
usort($array, fn($a, $b) => $a->count <=> $b->count);
배열에서 두 값을 하지 않고 ).23420
를 참조해 주세요.이것은 신뢰할 수 있는 디폴트 기능입니다.
정렬할 열을 가변적으로 선언하는 경우에도 두 방법 모두 변수를 추가 기법 없이 사용할 수 있습니다.
$property = 'count';
array_multisort(array_column($array, $property), $array);
$property = 'count';
usort($array, fn($a, $b) => $a->$property <=> $b->$property);
두 네이티브 정렬 함수는 모두 참조에 의해 수정되므로 반환 값으로 정렬된 배열에 액세스하지 마십시오.
array_multisort()
오름차순이므로 이 되지 SORT_ASC
두 배열 매개 변수 사이에 있습니다.한 경우 '내림차순 정렬'이라고.SORT_DESC
(두 번째 파라미터로서) 2개의 어레이 사이에 있습니다.
usort()
이 「오름차순」을 , 됩니다.$a
및 주 and data on$b
'내림차순으로 정렬하다'라고 쓰면 .$b
, 왼쪽의 데이터, 왼쪽의 데이터, 왼쪽의$a
오른쪽의 데이터입니다.
두 방법 모두 여러 정렬 규칙을 받을 수 있지만, 이 질문은 단일 열로만 정렬하도록 요구하기 때문에 이 지침은 여기서 부적절합니다.
(예: 함수는 다음과 같습니다).strcmp()
)을(를) 반복합니다.이것은 더 이상 베스트 프랙티스가 아닙니다.쌍방향 비교를 사용하는 것도 아닙니다(예:>
★★★★★★★★★★★★★★★★★」<
부울 결과를 반환합니다.는 3자 비교가 됩니다.usort()
.
규칙/컬럼/속성이 여러 개인 데이터를 정렬하는 경우 이 답변은 좋은 지침을 제공합니다.
멀티키 먹기에 대한 데모데이브의 참조 답변
function array_sort_by(array $arr, $keys){
if(!is_array($keys))
$keyList = explode(',', $keys);
$keyList = array_keys(array_flip($keyList)); // array_unique
$keyList = array_reverse($keyList);
$result = &$arr;
foreach ($keyList as $key) {
if(array_key_exists($key, $arr))
$result = usort($result, function($a, $b) use ($key) { return strcmp($a->{$key}, $b->{$key}); });
}
return $result;
}
오브젝트 필드별로 오브젝트 배열을 정렬한 방법은 다음과 같습니다.
코드: (데모) -- last_name ASC, first_name ASC 순으로 정렬합니다.
<?php
$array = array(
(object)array(
'first_name' => 'Léa',
'last_name' => 'Weber',
),
(object)array(
'first_name' => 'Alexandre',
'last_name' => 'Dupont',
),
(object)array(
'first_name' => 'Léa',
'last_name' => 'Zotal',
),
(object)array(
'first_name' => 'Jérémie',
'last_name' => 'Hoffmann',
)
);
usort($array, function($a, $b) {
return [$a->last_name, $a->first_name]
<=>
[$b->last_name, $b->first_name];
});
var_export($array);
출력:
array (
0 =>
(object) array(
'first_name' => 'Alexandre',
'last_name' => 'Dupont',
),
1 =>
(object) array(
'first_name' => 'Jérémie',
'last_name' => 'Hoffmann',
),
2 =>
(object) array(
'first_name' => 'Léa',
'last_name' => 'Weber',
),
3 =>
(object) array(
'first_name' => 'Léa',
'last_name' => 'Zotal',
),
)
PHP7.4 이상의 화살표 구문.우주선 연산자(<=>)로 "복합 비교 연산자" 또는 "삼원 비교 연산자"로 여러 열에 의한 정렬을 매우 쉽게 합니다.
리소스: https://wiki.php.net/rfc/combined-comparison-operator https://stackoverflow.com/a/54647220/18090932
언급URL : https://stackoverflow.com/questions/4282413/sort-array-of-objects-by-one-property
'programing' 카테고리의 다른 글
MySQL에서 문자열로 동작하기 위한 breakdrop()에 상당합니다. (0) | 2022.09.27 |
---|---|
JavaScript에서 문자열에서 파일 확장자를 자르는 방법 (0) | 2022.09.27 |
PDF 문서를 PHP의 미리보기 이미지로 변환하려면 어떻게 해야 합니까? (0) | 2022.09.27 |
동일한 테이블 mysql 저장 프로시저에서 조건이 다른 여러 카운트를 선택합니다. (0) | 2022.09.27 |
앵귤러 루트와 앵귤러 라우터의 차이점은 무엇입니까? (0) | 2022.09.27 |