Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何避免未定义的偏移量_Php - Fatal编程技术网

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