PHP:即使在检查 IsSet 后仍未定义索引

PHP: Undefined index even after checking IsSet

提问人:AnimaSola 提问时间:5/11/2017 更新时间:8/27/2018 访问量:8363

问:

我读过其他问题,没有一个回答也没有帮助我。

这是我的问题,我有一个对象/数组,其中包含一个属性,该属性也是一个对象/数组。

我之前通过以下方式成功访问过类似的属性:

$variable[propertyObject][property]

但是,我最近一直收到错误通知:未定义的索引

代码如下:

$extensionData = $data['Data'];
echo '<p>' . isset($extensionData['Calories']) ? $extensionData['Calories'] : '' . '</p>';

但是,这仍然会引发相同的错误。即使我检查:

isset($extensionData['Calories']),它总是解析为 1/True,这意味着该属性应该存在,那么索引怎么可能未定义呢?

当我做var_dump或print_r时,我得到的是:$extensionData

Array
(
    [Calories] => 295
    [WebDesktopImage] => https://clutch-asset-management.s3.amazonaws.com/elevation-burger/IMG_0760-Edit.jpg
    [WebMobileImage] => https://clutch-asset-management.s3.amazonaws.com/elevation-burger/IMG_0760-Edit.jpg
    [WebDescription] => BLT image
)
php 数组 索引 undefined-index

评论

3赞 Niet the Dark Absol 5/11/2017
把你的三元操作放在一起。它可能把事情搞砸了。(parentheses)
0赞 AnimaSola 5/11/2017
@NiettheDarkAbsol谢谢,但这没有用,最糟糕的是它通过了 isset,但突然说它是一个未定义的索引
1赞 gaganshera 5/11/2017
这是在循环中吗?试着在语句之前写。isset($extensionData['Calories']) var_dump($extensionData['Calories']);echo
0赞 AnimaSola 5/11/2017
我没有尝试内联,而是在函数的开头声明了一个变量,并以某种方式解决了它,非常奇怪。
0赞 MonkeyZeus 5/11/2017
@AnimaSola请看下面的回答

答:

12赞 MonkeyZeus 5/11/2017 #1

三元表达式:

isset($extensionData['Calories']) ? $extensionData['Calories'] : ''

像这样单独使用时是可以的:

echo isset($extensionData['Calories']) ? $extensionData['Calories'] : '';

$tmp_var = isset($extensionData['Calories']) ? $extensionData['Calories'] : '';

return isset($extensionData['Calories']) ? $extensionData['Calories'] : '';

因为它等价于预期的:

if(isset($extensionData['Calories']))
{
    // use $extensionData['Calories']
}
else
{
    // use empty string ''
}

但是,当用于字符串连接时,您需要括号来限制比较的范围,以便前导字符串不是比较的一部分

echo '<p>' . (isset($extensionData['Calories']) ? $extensionData['Calories'] : '') . '</p>';

做(错误的方式):

echo '<p>' . isset($extensionData['Calories']) ? $extensionData['Calories'] : '' . '</p>';

相当于

if('<p>' . isset($extensionData['Calories'])) // The leading string is used in the comparison and the result of isset() (boolean) is appended to the string so 100% of the time this example will be true because of how loose comparisons work
{
    echo $extensionData['Calories']; // Produces Undefined index error
}
else
{
    echo '' . '</p>';
}

综上所述:

如有疑问,请加上括号。

如果没有疑问,无论如何都要添加括号,因为当您必须在 6 个月内重新访问代码时,代码会更清晰。大多数文本编辑器都具有括号和括号匹配突出显示,因此添加括号是声明并在以后查看操作的预期行为的一种非常有用的方法。

如果您遇到某人的神秘代码并需要帮助弄清楚他们到底在想什么和/或没有考虑什么,请参阅运算符优先级

评论

2赞 Khan Shahrukh 8/26/2018
你是救命恩人,为什么这个答案没有得到很多赞成?
0赞 MonkeyZeus 8/27/2018
@KhanShahrukh 我很高兴你觉得这很有用。至于点赞,Stack Overflow 以神秘的方式工作:-p
1赞 OnNIX 5/11/2017 #2

以下代码的计算结果为 True,因此您的 isset() 查询被否定:

echo '<p>' . isset($extensionData['Calories'])

这将返回 True,因为字符串 '<p>' 为 true。

试试这个:

echo '<p>' . ( isset($extensionData['Calories']) ? $extensionData['Calories'] : '' ) . '</p>';
1赞 Diéfani Favareto Piovezan 5/11/2017 #3

问题出在您的三元操作中。你的三元运算符有点混乱,你在与字符串连接时没有定义范围。您需要在三元运算中添加括号,并将字符串与操作隔离开来。代码的语句与isset()if

if('<p>'. isset($extensionData['Calorie']))
{
   echo $extensionData[´Calorie´];
}
else 
{
  echo ''.'</p>';
}

我建议你把它放在一个变量中,以便更好地组织你的代码

$extensionData = $data['Data'];
$varCalorie = (isset($extensionData['Calories']) ? $extensionData['Calories'] : ''); 
echo '<p>'. $varCalorie . '<p/>'; 

以上内容与

if (isset($extensionData['Calories'])) {
    $varCalorie = $extensionData['Calories'];
    echo '<p>'. $varCalorie . '<p/>'; 
} else {
    $varCalorie = '';
    echo '<p>'. $varCalorie . '<p/>'; 
}

你也可以做

echo isset($extensionData['Calories']) ? $extensionData['Calories'] : '';
return isset($extensionData['Calories']) ? $extensionData['Calories'] : '';