복붙노트

객체 필드별로 객체 배열 정렬

PHP

객체 필드별로 객체 배열 정렬

이름이나 개수와 같은 해당 필드 중 하나를 사용하여이 객체 배열을 정렬하려면 어떻게해야합니까?

  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
        )

   ....

해결법

  1. ==============================

    1.usort를 사용하십시오. 다음은 매뉴얼에서 수정 한 예제입니다.

    usort를 사용하십시오. 다음은 매뉴얼에서 수정 한 예제입니다.

    function cmp($a, $b)
    {
        return strcmp($a->name, $b->name);
    }
    
    usort($your_data, "cmp");
    

    댓글에서 가져온 수정 사항 :

    클래스 내부에서 배열을 정렬하고 정렬 함수 cmp가 클래스 내부에도 정의되어 있으면 다음을 사용합니다.

    usort($your_data, array($this, "cmp"))
    
  2. ==============================

    2.클로저를 사용하여 더 좋은 방법을 보여줍니다.

    클로저를 사용하여 더 좋은 방법을 보여줍니다.

    usort($your_data, function($a, $b)
    {
        return strcmp($a->name, $b->name);
    });
    

    이것은 PHP의 문서에는 없지만 호출 가능한 인수를 제공 할 수있는 5.3+ 클로저를 사용하는 경우에 유의하십시오.

  3. ==============================

    3.php oop을 사용한다면 다음과 같이 변경해야 할 수도 있습니다 :

    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')); 
    
  4. ==============================

    4.

    usort($array, 'my_sort_function');
    
    var_dump($array);
    
    function my_sort_function($a, $b)
    {
        return $a->name < $b->name;
    }
    

    동일한 코드가 카운트 필드와 함께 있습니다.

    usort에 대한 추가 정보 : http://ru2.php.net/usort

    Btw, 어디에서 배열 가져 왔니? 데이터베이스가 아닌가요?

  5. ==============================

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

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

    // 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);
    });
    
  6. ==============================

    6.이 함수를 사용할 수 있습니다 (PHP Version> = 5.3에서 작동합니다) :

    이 함수를 사용할 수 있습니다 (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)
    
  7. ==============================

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

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

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

    8.여기서 모든 대답의 단점은 정적 필드 이름을 사용한다는 것입니다. 따라서 OOP 스타일로 조정 된 버전을 작성했습니다. getter 메서드를 사용한다고 가정하면이 클래스를 직접 사용할 수 있고 매개 변수로 필드 이름을 사용할 수 있습니다. 아마도 누군가가 유용하다고 생각할 것입니다.

    여기서 모든 대답의 단점은 정적 필드 이름을 사용한다는 것입니다. 따라서 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;
        }
    } 
    
  9. ==============================

    9.모든 것이 여기에 실패하면 또 다른 해결책이 있습니다.

    모든 것이 여기에 실패하면 또 다른 해결책이 있습니다.

    $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;
    
  10. ==============================

    10.로컬 기반 문자열 비교가 필요하면 strcmp 대신 strcoll을 사용할 수 있습니다.

    로컬 기반 문자열 비교가 필요하면 strcmp 대신 strcoll을 사용할 수 있습니다.

    필요한 경우 LC_COLLATE와 함께 setlocale을 사용하여 로켈 정보를 설정해야합니다.

      usort($your_data,function($a,$b){
        setlocale (LC_COLLATE, 'pl_PL.UTF-8'); // Example of Polish language collation
        return strcoll($a->name,$b->name);
      });
    
  11. ==============================

    11.Codeigniter 내에서 이것을 사용하는 경우 다음 방법을 사용할 수 있습니다.

    Codeigniter 내에서 이것을 사용하는 경우 다음 방법을 사용할 수 있습니다.

    usort($jobs, array($this->job_model, "sortJobs"));  // function inside Model
    usort($jobs, array($this, "sortJobs")); // Written inside Controller.
    

    @rmooney 제안 해 주셔서 감사합니다. 정말 도움이됩니다.

  12. ==============================

    12.정렬을 기반으로하는 필드를 동적으로 결정할 수있는 간단한 대안 :

    정렬을 기반으로하는 필드를 동적으로 결정할 수있는 간단한 대안 :

    $order_by = 'name';
    usort($your_data, function ($a, $b) use ($order_by)
    {
        return strcmp($a->{$order_by}, $b->{$order_by});
    });
    

    이는 익명의 기능을 허용하는 Closure 클래스를 기반으로합니다. PHP 5.3부터 사용할 수 있습니다.

  13. ==============================

    13.하나의 필드로 정렬해야하는 경우 usort가 좋은 선택입니다. 그러나 여러 필드로 정렬해야하는 경우 솔루션이 빨리 지저분 해집니다. 이 경우 YaLinqo 라이브러리 *를 사용할 수 있습니다.이 라이브러리는 배열 및 객체에 대해 SQL과 유사한 쿼리 구문을 구현합니다. 그것은 모든 경우에 대한 예쁜 구문을 가지고 있습니다 :

    하나의 필드로 정렬해야하는 경우 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'는 함수 ($ v)의 줄임말이다. {return $ v-> count; } (둘 중 하나만 사용 가능). 이러한 메소드 체인은 반복자를 반환하지만 필요할 경우 끝에 -> toArray ()를 추가하여 배열을 가져올 수 있습니다.

    * 나에 의해 개발 됨

  14. ==============================

    14.Nspl에서 정렬 된 함수를 사용할 수 있습니다.

    Nspl에서 정렬 된 함수를 사용할 수 있습니다.

    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'));
    
  15. ==============================

    15.영감을 주셔서 감사합니다. 또한 외부 $ translator 매개 변수를 추가해야했습니다.

    영감을 주셔서 감사합니다. 또한 외부 $ translator 매개 변수를 추가해야했습니다.

    usort($listable_products, function($a, $b) {
        global $translator;
        return strcmp($a->getFullTitle($translator), $b->getFullTitle($translator));
    });
    
  16. ==============================

    16.날짜를 정렬하려면

    날짜를 정렬하려면

       usort($threads,function($first,$second){
            return strtotime($first->dateandtime) < strtotime($second->dateandtime);
        });
    
  17. from https://stackoverflow.com/questions/4282413/sort-array-of-objects-by-object-fields by cc-by-sa and MIT license