객체 필드를 기준으로 객체 배열 정렬

이 객체 배열을 필드 중 하나 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");

두 번째 인수로 모든 호출 가능 항목 을 사용할 수도 있습니다 . 여기 몇 가지 예가 있어요.

  • 익명 함수 사용하기 (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 이상의 클로저를 사용하는 경우 호출 가능한 인수가 제공 될 수있는 곳에서 지원됩니다.


답변

정수 값을 정렬하려면 다음을 수행하십시오.

// 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필드 와 동일한 코드가 사용됩니다 .

에 대한 자세한 내용 usort: http://ru2.php.net/usort

Btw, 그 어레이를 어디서 얻었습니까? 나는 데이터베이스에서 그것을 원하지 않습니까?


답변

이 기능을 사용할 수 있습니다 (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)


답변

다음 usort과 같이 사용할 수 있습니다 .

usort($array,function($first,$second){
    return strcmp($first->name, $second->name);
});