programing

개체 배열을 속성별로 정렬합니다.

sourcejob 2022. 9. 27. 23:50
반응형

개체 배열을 속성별로 정렬합니다.

중 하나요?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"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;
}

같은 코드가 에 있습니다.countsyslog.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()결국엔 필요하게 될 거야

* 내가 개발한

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'));

이게 제가 가지고 있는 유틸리티 클래스입니다.

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

반응형