programing

콜백에 추가 파라미터 전달

yoursource 2023. 3. 18. 14:24
반응형

콜백에 추가 파라미터 전달

다음과 같은 기능이 있습니다.WordPress는 기능하지만 이것은 실제로 PHP 질문입니다.그들은 나를 분류한다.$term에 따른 오브젝트artist_lastname각 오브젝트의 메타데이터에 속성이 있습니다.

끈을 건네주고 싶다$meta첫 번째 기능에서.이를 통해 이 코드를 다양한 메타데이터 속성에 적용할 수 있으므로 재사용할 수 있습니다.

하지만 어떻게 하면 추가 파라미터를 Usort 콜백에 전달할 수 있는지 이해할 수 없습니다.JS 스타일의 익명 함수를 만들려고 했는데 서버상의 PHP 버전이 너무 오래되어(5.2.17) 구문 오류가 발생했습니다.

설명서 오른쪽 모서리에 밀어주시면 감사하겠습니다.감사합니다!

function sort_by_term_meta($terms, $meta) 
{
  usort($terms,"term_meta_cmp");
}

function term_meta_cmp( $a, $b ) 
{
    $name_a = get_term_meta($a->term_id, 'artist_lastname', true);
    $name_b = get_term_meta($b->term_id, 'artist_lastname', true);
    return strcmp($name_a, $name_b); 
}

PHP 버전: 5.2.17

이 질문은 갱신할 가치가 있다고 생각합니다.원래 질문은 PHP 버전 5.2에 대한 것이었지만, 저는 해결책을 찾아 이곳에 왔고, 새로운 버전의 PHP에 대한 해결책을 찾았고, 이것이 다른 사람들에게도 유용할 수 있다고 생각했습니다.

PHP 5.3 이상에서는 'use' 키워드를 사용하여 익명 함수의 로컬 범위에 로컬 변수를 추가할 수 있습니다.따라서 다음 기능이 작동합니다.

function sort_by_term_meta(&$terms, $meta) {
    usort($terms, function($a, $b) use ($meta) {
        $name_a = get_term_meta($a->term_id, 'artist_lastname', true);
        $name_b = get_term_meta($b->term_id, 'artist_lastname', true);
        return strcmp($name_a, $name_b);  
    });
}

기타 일반적인 코드

어레이를 한 번만 정렬하고 추가 인수가 필요한 경우 다음과 같은 익명 함수를 사용할 수 있습니다.

usort($arrayToSort, function($a, $b) use ($myExtraArgument) {
    //$myExtraArgument is available in this scope
    //perform sorting, return -1, 0, 1
    return strcmp($a, $b);
});

추가 인수가 필요한 배열을 정렬하기 위해 재사용 가능한 함수가 필요한 경우 원래 질문처럼 익명 함수를 항상 래핑할 수 있습니다.

function mySortFunction(&$arrayToSort, $myExtraArgument1, $myExtraArgument2) {
    usort($arrayToSort, function($a, $b) use ($myExtraArgument1, $myExtraArgument2) {
        //$myExtraArgument1 and 2 are available in this scope
        //perform sorting, return -1, 0, 1
        return strcmp($a, $b);
    });
}

PHP에서 콜백의 한 가지 옵션은 오브젝트 핸들 및 오브젝트에 호출할 메서드 이름을 포함하는 2 요소 배열을 전달하는 것입니다.예를 들어,$obj계급의 한 예였다MyCallable를 호출하고 싶다.method1의 방법MyCallable$obj그럼 합격할 수 있습니다.array($obj, "method1")콜백으로 사용합니다.

지원되는 이 콜백유형을 사용하는 솔루션 중 하나는 기본적으로 클로저유형처럼 동작하는 일회용 클래스를 정의하는 것입니다.

function sort_by_term_meta( $terms, $meta ) 
{
    usort($terms, array(new TermMetaCmpClosure($meta), "call"));
}

function term_meta_cmp( $a, $b, $meta )
{
    $name_a = get_term_meta($a->term_id, $meta, true);
    $name_b = get_term_meta($b->term_id, $meta, true);
    return strcmp($name_a, $name_b); 
} 

class TermMetaCmpClosure
{
    private $meta;

    function __construct( $meta ) {
        $this->meta = $meta;
    }

    function call( $a, $b ) {
        return term_meta_cmp($a, $b, $this->meta);
    }
}

오브젝트 및 스태틱(PHP 5 이상)에 액세스 할 수 있다고 가정하면 다음과 같이 오브젝트를 생성하여 인수를 직접 전달할 수 있습니다.

<?php
class SortWithMeta {
    private static $meta;

    static function sort(&$terms, $meta) {
       self::$meta = $meta;
       usort($terms, array("SortWithMeta", "cmp_method"));
    }

    static function cmp_method($a, $b) {
       $meta = self::$meta; //access meta data
       // do comparison here
    }

}

// then call it
SortWithMeta::sort($terms, array('hello'));

오브젝트/스태틱에 액세스할 수 없다고 가정하고 글로벌하게 수행할 수 있습니다.

$meta = array('hello'); //define meta in global

function term_meta_cmp($a, $b) {
   global $meta; //access meta data
   // do comparison here
}

usort($terms, 'term_meta_cmp');

경고 이 함수는 PHP 7.2.0에서 폐지되었습니다.이 기능에 의존하는 것은 매우 권장되지 않습니다.

문서에서는 PHP > = 4.0.1에서 작동해야 한다고 합니다.이거 되는 거야?

function term_meta_cmp( $a, $b, $meta )  {
    echo "$a, $b, $meta<hr>"; // Debugging output
}
$terms = array("d","c","b","a");
usort($terms, create_function('$a, $b', 'return term_meta_cmp($a, $b, "some-meta");'));

하면 전혀 이 되지 않습니다.usort()그래도 도움이 될 수 있을 거야다른 정렬 기능 중 하나를 사용하여 배열을 정렬할 수 있습니다.

이 아이디어는 정렬할 값의 배열을 구축하는 것입니다(복귀되는 값).get_term_meta()(Multi-Sort)에 멀티소트(Multi-Sort는 Multi-Sort)$termsmanager.manager로 하다

function sort_by_term_meta(&$terms, $meta) 
{
    $sort_on = array();
    foreach ($terms as $term) {
        $sort_on[] = get_term_meta($term->term_id, $meta, true);
    }
    array_multisort($sort_on, SORT_ASC, SORT_STRING, $terms);
}

usort()에 Arg를 전달하기 위한 가장 간단한 해결책은 무엇입니까?

저는 이 답변의 많은 부분이 마음에 들지만, 가능한 한 간단하게 할 수 있는 솔루션과 데모할 수 있는 솔루션을 원했습니다.전화할 때usort해 주세요

usort($sortable, [$arg1, $arg2, ... $argn, compareFunction]);

하지만 그 전에 반드시 이 주장을 정의해 두셔야 합니다.그러면 당신은 결국 다음과 같은 결과가 됩니다.

$arg1 = 'something';
$arg2 = 'something else';
$argn = 'yet another thing';

usort($sortable, [$arg1, $arg2, ... $argn, compareFunction]);

★★★★★★★★★★★★★★★.$arg1,$arg2 , , , , 입니다.$argn will will will will will will will 。compareFunction().

데모 업!

예를 들어 설명하겠습니다.usort()비교되는 요소의 처음 세 글자만 고려합니다.

function cmp ($a, $b) {
     return strcmp(substr($a, 0, $num), substr($a, 0, $num));
}

$terms = ['123a', '123z', '123b',];
$num = 3;
$thing = 4;
usort($terms, [$num, $thing, cmp]);

print_r($terms);

풀워크 데모 온라인

언급URL : https://stackoverflow.com/questions/8230538/pass-extra-parameters-to-usort-callback

반응형