programing

정의되지 않은 간격띄우기를 방지하는 방법

newnotes 2023. 9. 7. 22:02
반응형

정의되지 않은 간격띄우기를 방지하는 방법

이러한 오류/알림을 쉽게 피할 수 있는 방법은 무엇입니까?

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

... 다음 코드에서:

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

폭발로 인해 반환되는 값이 항상 두 개인 것은 아니지만, list()를 사용하려면 어떻게 하면 쉽게 알림을 피할 수 있습니까?

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

두 가지 변경 사항:

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

이 말은, 만약 없다면,|인에$value,$field === null. 물론 기본값으로 정의하려는 모든 값을 사용할 수 있습니다.$field(무료로)null). 의 동작을 바꿀 수도 있습니다.$func그리고.$field

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

지금이다$funcnull, 없을 때는|인에$value.

저는 이것을 하는 데 있어서 편리함을 보존하는 직접적인 방법을 알지 못합니다.

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

하지만, 이렇게 할 수 없다는 것이 정말 유감스러운 일이기 때문에, 당신은 교활한 간접적인 접근법을 고려해 볼 수도 있습니다.

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

에 첨부했습니다.$value수만큼|확실히 하기 위해 필요한 경우에 따라explode최소 2개 이상의 아이템을 생산할 것입니다.n변수, 추가n-1구분 기호 문자.

이렇게 하면 오류가 발생하지 않고 편리함을 유지할 수 있습니다.listassignment, 그리고 입력에 존재하지 않았던 모든 값이 빈 문자열로 설정됩니다.대부분의 경우 후자가 문제를 주지 않아야 위의 아이디어가 효과가 있을 것입니다.

효과가 있었습니다.

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

당신은.undefined offset네가 그 끈을 폭발시키려고 할 때 ()$value제 생각엔 실제로는 그런 게 없는 것 같습니다.

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

오류를 방지하기 위해 '|'의 발생 여부를 확인하는 방법은 다음과 같습니다.

$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;

그래도 아마 더 빠르고 깔끔한 방법이 있을 겁니다.

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 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);

variadic function: http://php.net/manual/en/functions.arguments.php#functions.variable-arg-list 을 사용하려면 PHP 5.6 이상이 필요합니다.

제가 수십 년 동안 사용해 온 좀 더 일반적인 유틸리티 기능에 대해 말씀드리고 싶습니다.빈 값을 걸러내고 공백을 자릅니다.사용하기도 합니다.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

반응형