정의되지 않은 간격띄우기를 방지하는 방법
이러한 오류/알림을 쉽게 피할 수 있는 방법은 무엇입니까?
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);
지금이다$func가null, 없을 때는|인에$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
'programing' 카테고리의 다른 글
| jQuery.each() index? (0) | 2023.09.07 |
|---|---|
| sklearn plot 레이블이 있는 혼동 행렬 (0) | 2023.09.07 |
| 함수가 받는 키워드 인수를 나열할 수 있습니까? (0) | 2023.09.07 |
| jQuery로 iframe의 컨텐츠에 액세스하는 방법은 무엇입니까? (0) | 2023.09.07 |
| AddChart2 VBA 매크로의 숫자는 무엇을 나타냅니까? (0) | 2023.09.07 |