我已经阅读了其他问题,没有人回答或帮助我。
这是我的问题,我有一个对象/数组,其中包含一个属性,该属性也是一个对象/数组。
我之前通过以下方式成功访问过类似的属性:
$variable[propertyObject][property]
但是,我最近一直收到错误通知: undefined index 。
代码如下:
$extensionData = $data['Data'];
echo '<p>' . isset($extensionData['Calories']) ? $extensionData['Calories'] : '' . '</p>';
但是,这仍然会引发相同的错误。即使我检查:
isset($extensionData['Calories'])
,它总是解析为 1/True 这意味着该属性应该存在,那么索引怎么可能是未定义的?
当我执行 $extensionData
的 var_dump 或 print_r 时,这就是我得到的:
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
)
最佳答案
三元表达式:
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 个月后重新访问代码时,代码会更加清晰。大多数文本编辑器都有括号和括号匹配突出显示,因此添加括号是一种非常有益的方式来声明和稍后查看操作的预期行为。
参见 Operator Precedence如果您遇到某人的神秘代码并需要帮助来弄清楚他们到底在想什么和/或没有考虑什么。
关于PHP:即使在检查 IsSet 后仍未定义索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43900448/