정의되지 않은 오프셋을 방지하는 방법
이 오류 / 알림을 쉽게 피할 수있는 방법 :
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
'program tip' 카테고리의 다른 글
try catch 블록의 "when"키워드가 if 문과 동일합니까? (0) | 2020.12.29 |
---|---|
hbm2ddl을 끄는 방법? (0) | 2020.12.29 |
하위 쿼리에서 * 선택 (0) | 2020.12.29 |
HQL 쿼리에서 Hibernate 테이블이 매핑되지 않음 오류 (0) | 2020.12.29 |
GitHub에서 문제에 대한 사용자 지정 레이블을 만드는 방법은 무엇입니까? (0) | 2020.12.29 |