Php 如何避免未定义的偏移量
您如何轻松避免收到此错误/通知:Php 如何避免未定义的偏移量,php,Php,您如何轻松避免收到此错误/通知: Notice: Undefined offset: 1 in /var/www/page.php on line 149 。。。在此代码中: list($func, $field) = explode('|', $value); explode并不总是返回两个值,但是如果你想使用list(),那么你怎么能轻松地避免这个通知呢?我相信,当你试图将字符串分解的对象($value)实际上没有包含它时,你会得到一个未定义的偏移量 这个问题与此非常相似: ,这里有更进
Notice: Undefined offset: 1 in /var/www/page.php on line 149
。。。在此代码中:
list($func, $field) = explode('|', $value);
explode并不总是返回两个值,但是如果你想使用list(),那么你怎么能轻松地避免这个通知呢?我相信,当你试图将字符串分解的对象(
$value
)实际上没有包含它时,你会得到一个未定义的偏移量
这个问题与此非常相似:
,这里有更进一步的解释,可以完全解决您的问题
至于检查“|”的出现,为了防止出现错误,您可以执行以下操作:
$pos = strpos($value,'|');
if(!($pos === false)) {
//$value does contain at least one |
}
希望这有帮助
if (count(explode('|', $value))==2)
list($func, $field) = explode('|', $value);
不过,这有点不理想。我可能会将其分为两个步骤
$split = explode('|', $value);
$func = $split[0];
if(count($split) > 1)
$field = $split[1];
else
$field = NULL;
不过,可能有一种更快捷、更整洁的方法。我不知道有哪种直接的方法可以同时保持
list($func, $field) = explode('|', $value);
然而,由于不能做到这一点实在是遗憾,你可能想考虑一种偷偷摸摸的间接方法:
list($func, $field) = explode('|', $value.'|');
我在$value
中添加了所需数量的|
s,以确保分解
在数组中至少生成2个项目。对于n
变量,添加n-1
分隔符
这样您就不会得到任何错误,您可以保留方便的列表
赋值,并且输入中不存在的任何值都将设置为空字符串。对于大多数情况,后者不应给您带来任何问题,因此上述想法将起作用
list($func, $field) = array_pad(explode('|', $value, 2), 2, null);
两个变化:
- 它将
explode()
返回的数组大小限制为2。看来,我们只需要这些
- 如果返回的值少于两个,则会追加
null
,直到数组包含2个值。有关更多信息,请参阅
这意味着,如果$value
中没有|
,$field===null
。当然,您可以使用希望定义为$field
默认值的每个值(而不是null
)。还可以交换$func
和$field
list($func, $field) = array_pad(explode('|', $value, 2), -2, null);
现在$func
是空的
,而$value
中没有
,这对我来说很有用:
@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);
//将数组项放入变量中。未定义的索引默认为null
函数toVars($arr,&…$ret)
{
$n=计数($arr);
foreach($ret as$i=>&$r){
$r=$i<$n?$arr[$i]:空;
}
}
//示例用法
toVars(分解(“|”,$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);
//分解并将条目放入变量中。未定义的索引默认为null
函数explodeTo($delimiter,$s,&…$ret)
{
$arr=爆炸($delimier,$s);
$n=计数($arr);
foreach($ret as$i=>&$r){
$r=$i<$n?$arr[$i]:空;
}
}
//示例用法
toVars(“|”,$value,$func,$field);
可变功能需要PHP5.6或更高版本:
我想提及一个我几十年来一直使用的更通用的实用函数。它过滤掉空值并修剪空格。它还使用array\u pad()
来确保您至少获得所请求的值量(如@KingCrunch所建议的)
爆炸两次?为什么不检测是否有管道字符,然后爆炸?这会留下未定义的$field
,这几乎不比未定义的索引好多少。是的,你是对的。我已经添加了一行,以将其设置为NULL,以防以前定义过它。但无论如何,我想在使用$field之前,您应该先检查它的值。如果这都是关于“不显示”通知,我们不能通过执行@explode()来抑制它吗?我知道它不漂亮,但它能成功,对吗?如果你真的想“避免”它,那么你绝对是对的…@KilZone:这并不是真正的“不显示”它,而是“这段代码是这样写的,如果它出现错误,它就有一个bug”。此外,尽可能避免使用@
运算符。你知道在操作员的文件中吗?我不止一次地爱上了这一点。是的,我明白你(和克拉克)的观点,我只是想知道。哦,是的,我知道这个警告,这不是我第一次盯着空白屏幕看我的页面应该在哪里。真的,真的很遗憾!他们在想什么…:-(@Down Voter你能解释一下原因吗?如果我犯了错误,我就不会被否决,如果你能解释一下为什么我可以更正帖子,也可以从我的错误中吸取教训!干杯。即使strpos
返回true
$value='几乎完美';$pos=strpos($value,'124;');如果($pos==true){list($1,$2,$3)=explode('|',$value);}
我同意你@bart的观点。大多数情况下都是这样,但在这个特定的情况下,我看不出不使用它有什么大问题。
/**
* 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;
}