program tip

정의되지 않은 오프셋을 방지하는 방법

radiobox 2020. 12. 29. 06:55
반응형

정의되지 않은 오프셋을 방지하는 방법


이 오류 / 알림을 쉽게 피할 수있는 방법 :

Notice: Undefined offset: 1 in /var/www/page.php on line 149

...이 코드에서 :

list($func, $field) = explode('|', $value);

explode에서 항상 두 개의 값이 반환되는 것은 아니지만 list ()를 사용하려면 어떻게 알림을 쉽게 피할 수 있습니까?


list($func, $field) = array_pad(explode('|', $value, 2), 2, null);

두 가지 변경 사항 :

  • 반환되는 배열의 크기 explode()를 2 로 제한합니다 .이 이상은 원하지 않는 것 같습니다.
  • 반환 된 값이 두 개 미만 null이면 배열에 두 개의 값이 포함될 때까지 추가 됩니다. 자세한 내용은 Manual : array_pad ()참조하십시오 .

이 수단에는 존재하지 않는 경우 |$value, $field === null. 물론 기본값으로 정의하려는 모든 값을 사용할 수 있습니다 $field(대신 null). $func의 동작을 바꿀 수도 있습니다.$field

list($func, $field) = array_pad(explode('|', $value, 2), -2, null);

지금 $func이다 null더이없는 경우, |에서 $value.


이 작업을 수행하는 직접적인 방법은

list($func, $field) = explode('|', $value);

그러나 이것을 할 수 없다는 것은 정말 유감이기 때문에 간결한 간접 접근을 고려할 수 있습니다.

list($func, $field) = explode('|', $value.'|');

배열에 적어도 2 개의 항목을 생성 할 수 있도록 필요한 $value만큼 많은 |s를 추가했습니다 explode. 들어 n변수, 추가 n-1문자 구분 기호.

이렇게하면 오류가 발생하지 않고 편리한 list할당 을 유지 하며 입력에없는 값은 빈 문자열로 설정됩니다. 대부분의 경우 후자는 문제를 일으키지 않으므로 위의 아이디어가 작동합니다.


undefined offset( $value)로 문자열을 폭발시키려는 것이 실제로 그것을 가지고 있지 않을 얻을 수 있습니다.

이 질문은 다음과 매우 유사합니다. php explode ()를 사용할 때 정의되지 않은 오프셋 , 문제를 완전히 해결해야하는 훨씬 더 자세한 설명이 있습니다.

'|'발생 확인 오류를 방지하기 위해 다음을 수행 할 수 있습니다.

$pos = strpos($value,'|');

if(!($pos === false)) {
     //$value does contain at least one |
}

도움이 되었기를 바랍니다.


아마 이것을 두 단계로 나눌 것입니다

$split = explode('|', $value);
$func = $split[0];
if(count($split) > 1)
  $field = $split[1];
else
  $field = NULL;

하지만 더 빠르고 깔끔한 방법이있을 것입니다.


이것은 나를 위해 일했습니다.

@list($func, $field) = explode('|', $value);

if (count(explode('|', $value))==2)
  list($func, $field) = explode('|', $value);

그러나 약간 최적이 아닙니다.


나는 종종이 문제를 접하게 되었기 때문에 불필요하게 배열이나 문자열을 채우지 않고 구문 적으로 더 좋은 것을 허용하는 함수를 원했습니다.

// Put array entries in variables. Undefined index defaults to null
function toVars($arr, &...$ret)
{
    $n = count($arr);
    foreach ($ret as $i => &$r) {
        $r = $i < $n ? $arr[$i] : null;
    }
}

// Example usage
toVars(explode('|', $value), $func, $field);

내 목적을 위해 일반적으로 배열로 작업하지만 다음과 같이 explode 함수를 포함하는 유사한 함수를 작성할 수 있습니다.

// Explode and put entries in variables. Undefined index defaults to null
function explodeTo($delimiter, $s, &...$ret)
{
    $arr = explode($delimier, $s);
    $n = count($arr);
    foreach ($ret as $i => &$r) {
        $r = $i < $n ? $arr[$i] : null;
    }
}

// Example usage
toVars('|', $value, $func, $field);

가변 함수를 위해 PHP5.6 이상 필요 : http://php.net/manual/en/functions.arguments.php#functions.variable-arg-list


제가 수십 년 동안 사용했던보다 일반적인 유틸리티 함수를 언급하고 싶습니다. 빈 값을 필터링하고 공백을 잘라냅니다. 또한 array_pad()최소한 요청 된 값 (@KingCrunch에서 제안한대로)을 확보하기 위해 사용 합니다.

/**
 * Does string splitting with cleanup.
 * Added array_pad() to prevent list() complaining about undefined index
 * @param $sep string
 * @param $str string
 * @param null $max
 * @return array
 */
function trimExplode($sep, $str, $max = null)
{
    if ($max) {
        $parts = explode($sep, $str, $max); // checked by isset so NULL makes it 0
    } else {
        $parts = explode($sep, $str);
    }
    $parts = array_map('trim', $parts);
    $parts = array_filter($parts);
    $parts = array_values($parts);
    $parts = array_pad($parts, $max, null);
    return $parts;
}

참조 URL : https://stackoverflow.com/questions/6576313/how-to-avoid-undefined-offset

반응형