PHP를 위한 병합 함수?
많은 프로그래밍 언어에는 병합 함수가 있습니다(예: NULL이 아닌 첫 번째 값을 반환합니다).2009년 PHP는 슬프게도 그렇지 않다.
PHP 자체에서 통합 함수를 얻을 때까지 PHP에서 이를 구현하는 좋은 방법은 무엇일까요?
5하는 새로운 . php 5.3 음음 、 5음 、 there there there there 。?:
// A
echo 'A' ?: 'B';
// B
echo '' ?: 'B';
// B
echo false ?: 'B';
// B
echo null ?: 'B';
출처 : http://www.php.net/ChangeLog-5.php#5.3.0
echo $_GET['doesNotExist'] ?? 'fallback'; // prints 'fallback'
「」의 ??
, 「」입니다.null
에 값??
사용되었습니다.
한 ★★★★★★★★★★★★의 개선점?:
「」라고 하는 입니다.??
, 변수도, 「」를 하지 않고 합니다.E_NOTICE
.
구글에서 "php coalese"를 처음으로 히트시켰습니다.
function coalesce() {
$args = func_get_args();
foreach ($args as $arg) {
if (!empty($arg)) {
return $arg;
}
}
return NULL;
}
http://drupial.com/content/php-coalesce
나는 정말 ?: 연산자를 좋아한다.아쉽게도 아직 제 생산환경에서 구현되지 않았습니다.그래서 다음과 같은 것을 사용합니다.
function coalesce() {
return array_shift(array_filter(func_get_args()));
}
PHP의 미가산 변수와 배열 인덱스에 대한 처리로 인해 어떤 종류의 병합 함수라도 제한적으로 사용할 수 있다는 점에 유의할 필요가 있습니다.저는 이것을 할 수 있으면 좋겠습니다.
$id = coalesce($_GET['id'], $_SESSION['id'], null);
그러나 대부분의 경우, 이로 인해 PHP가 E_NOTICE에서 오류를 일으킵니다.변수를 사용하기 전에 변수의 존재를 테스트하는 안전한 방법은 empty() 또는 isset()에서 직접 사용하는 것입니다.병합의 모든 옵션이 초기화된 것으로 알려진 경우 Kevin이 제안한 3원 연산자가 최상의 옵션입니다.
특정 유형에서 이 기능이 작동하는 방식을 정확하게 식별해야 합니다.PHP에는 다양한 타입 체크 기능이나 유사한 기능이 있기 때문에, 그것들이 어떻게 동작하는지를 확인해 주세요.is_null()과 empty()의 비교 예를 다음에 나타냅니다.
$testData = array(
'FALSE' => FALSE
,'0' => 0
,'"0"' => "0"
,'NULL' => NULL
,'array()'=> array()
,'new stdClass()' => new stdClass()
,'$undef' => $undef
);
foreach ( $testData as $key => $var )
{
echo "$key " . (( empty( $var ) ) ? 'is' : 'is not') . " empty<br>";
echo "$key " . (( is_null( $var ) ) ? 'is' : 'is not') . " null<br>";
echo '<hr>';
}
보시는 바와 같이 empty()는 이들 모두에 대해 true를 반환하지만 is_null()은 이들 중 2개에 대해서만 true를 반환합니다.
이단 켄트가 올린 답변에 대해 자세히 말씀드리겠습니다.이 답변에서는 array_filter의 내부 동작으로 인해 false로 평가되는 null 이외의 인수가 폐기됩니다.이 인수는 다음 명령어가 아닙니다.coalesce
일반적으로 기능합니다.예를 들어 다음과 같습니다.
echo 42 === coalesce(null, 0, 42) ? 'Oops' : 'Hooray';
어라
이를 극복하기 위해서는 두 번째 인수와 함수 정의가 필요합니다.호출 가능한 함수는 다음 정보를 전달하는 역할을 합니다.array_filter
결과 배열에 현재 배열 값을 추가할지 여부:
// "callable"
function not_null($i){
return !is_null($i); // strictly non-null, 'isset' possibly not as much
}
function coalesce(){
// pass callable to array_filter
return array_shift(array_filter(func_get_args(), 'not_null'));
}
그냥 통과해 주시면 감사하겠습니다.isset
또는'isset'
두 번째 논거로서array_filter
하지만 그런 행운은 없다.
현재 사용하고 있습니다만, PHP 5의 신기능으로 개선할 수 없는 것이 아닐까 생각하고 있습니다.
function coalesce() {
$args = func_get_args();
foreach ($args as $arg) {
if (!empty($arg)) {
return $arg;
}
}
return $args[0];
}
PHP 5.3+(폐쇄 포함):
function coalesce()
{
return array_shift(array_filter(func_get_args(), function ($value) {
return !is_null($value);
}));
}
데모: https://eval.in/187365
NULL이 아닌 첫 번째 값을 반환하는 함수:
function coalesce(&...$args) { // ... as of PHP 5.6
foreach ($args as $arg) {
if (isset($arg)) return $arg;
}
}
등가$var1 ?? $var2 ?? null
PHP 7+로 설정합니다.
비어 있지 않은 첫 번째 값을 반환하는 함수:
function coalesce(&...$args) {
foreach ($args as $arg) {
if (!empty($arg)) return $arg;
}
}
등가(isset($var1) ? $var1 : null) ?: (isset($var2) ? $var2 : null) ?: null
PHP 5.3+로 설정합니다.
위에서는 숫자 문자열 "0.00"이 비어 있지 않은 것으로 간주됩니다.일반적으로 HTTP GET, HTTP POST, 브라우저 쿠키 또는 MySQL 드라이버에서 float 또는 10진수를 숫자 문자열로 전달합니다.
정의되지 않은 첫 번째 변수를 반환하는 함수. null, (bool)false, (int)0, (float)0.00, (string)0", (string)0.00, (string)[ : ]
function coalesce(&...$args) {
foreach ($args as $arg) {
if (!empty($arg) && (!is_numeric($arg) || (float)$arg!= 0)) return $arg;
}
}
다음과 같이 사용:
$myvar = coalesce($var1, $var2, $var3, ...);
언급URL : https://stackoverflow.com/questions/1013493/coalesce-function-for-php
'source' 카테고리의 다른 글
문자열의 여러 서브스트링을 대체하려면 어떻게 해야 합니까? (0) | 2022.10.30 |
---|---|
파일 액세스에는 언제 mmap을 사용해야 합니까? (0) | 2022.10.30 |
VARCHAR과 CHAR의 차이점은 무엇입니까? (0) | 2022.10.30 |
동기화 vs 잠금 (0) | 2022.10.30 |
Ajax 업로드 이미지 (0) | 2022.10.30 |