Ani*_*ola 3 php arrays indexing undefined-index
我已经阅读了其他问题,没有人回答也没有帮助我。
这是我的问题,我有一个对象/数组,其中包含一个也是对象/数组的属性。
我已经通过以下方式成功访问了类似的属性:
$variable[propertyObject][property]
Run Code Online (Sandbox Code Playgroud)
但是,我已经收到错误通知:最近未定义索引。
这是代码:
$extensionData = $data['Data'];
echo '<p>' . isset($extensionData['Calories']) ? $extensionData['Calories'] : '' . '</p>';
Run Code Online (Sandbox Code Playgroud)
但是,这仍然会引发相同的错误。即使我检查:
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
)
Run Code Online (Sandbox Code Playgroud)
三元表达式:
isset($extensionData['Calories']) ? $extensionData['Calories'] : ''
Run Code Online (Sandbox Code Playgroud)
像这样独立使用时可以:
echo isset($extensionData['Calories']) ? $extensionData['Calories'] : '';
$tmp_var = isset($extensionData['Calories']) ? $extensionData['Calories'] : '';
return isset($extensionData['Calories']) ? $extensionData['Calories'] : '';
Run Code Online (Sandbox Code Playgroud)
因为它等于预期的:
if(isset($extensionData['Calories']))
{
// use $extensionData['Calories']
}
else
{
// use empty string ''
}
Run Code Online (Sandbox Code Playgroud)
但是,当在字符串连接中使用时,则需要括号以限制比较范围,以便前导字符串不属于比较的一部分
echo '<p>' . (isset($extensionData['Calories']) ? $extensionData['Calories'] : '') . '</p>';
Run Code Online (Sandbox Code Playgroud)
做(错误的方式):
echo '<p>' . isset($extensionData['Calories']) ? $extensionData['Calories'] : '' . '</p>';
Run Code Online (Sandbox Code Playgroud)
相当于
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>';
}
Run Code Online (Sandbox Code Playgroud)
结论:
如有疑问,请添加括号。
毫无疑问,请添加括号,因为当您必须在6个月内重新访问该代码时,该代码将更加清晰易读。大多数文本编辑器都有括号和突出显示的括号匹配项,因此添加括号是一种非常有益的声明方式,以后可以查看该操作的预期行为。
如果您遇到某人的密码不明并且需要帮助弄清楚他们在想什么和/或没有考虑的事情,请参阅操作员优先。