source

PHP를 위한 병합 함수?

lovecheck 2022. 10. 30. 17:57
반응형

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

PHP 7은 실제 병합 연산자를 도입했습니다.

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 ?? nullPHP 7+로 설정합니다.

비어 있지 않은 첫 번째 값을 반환하는 함수:

  function coalesce(&...$args) {
    foreach ($args as $arg) {
      if (!empty($arg)) return $arg;
    }
  }

등가(isset($var1) ? $var1 : null) ?: (isset($var2) ? $var2 : null) ?: nullPHP 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

반응형