PHP:即使检查了IsSet,也未定义索引

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)

Mon*_*eus 8

三元表达式:

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个月内重新访问该代码时,该代码将更加清晰易读。大多数文本编辑器都有括号和突出显示的括号匹配项,因此添加括号是一种非常有益的声明方式,以后可以查看该操作的预期行为。

如果您遇到某人的密码不明并且需要帮助弄清楚他们在想什么和/或没有考虑的事情,请参阅操作员优先

  • 您是救生员,为什么这个答案没有得到很多支持? (2认同)