콜백에 추가 파라미터 전달
다음과 같은 기능이 있습니다.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)$terms
manager.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
'programing' 카테고리의 다른 글
WordPress에서 파일 경로별로 첨부 파일 ID 가져오기 (0) | 2023.03.18 |
---|---|
리액트 라우터 프라이빗루트/리다이렉트가 기능하지 않음 (0) | 2023.03.18 |
데이터 소스 없이 스프링 부트 응용 프로그램 (0) | 2023.03.18 |
어레이 이름 없이 JSONArray를 가져오시겠습니까? (0) | 2023.03.18 |
jq - 오브젝트의 부모 값을 인쇄하려면 어떻게 해야 합니까? (0) | 2023.03.18 |