PHP:甚至在检查IsSet之后还有未定义的索引

时间:2017-05-10 18:44:14

标签: php arrays indexing undefined-index

我已经阅读了其他问题,没有人回答也没有帮助过我。

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

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

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

但是,我最近收到错误注意:未定义索引

以下是代码:

isset($extensionData['Calories'])

然而,仍然会抛出同样的错误。即使我检查:

$extensionData,它总是解析为1 / True,这意味着该属性应该存在,那么索引如何被定义?

当我执行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 ) 的var_dump或print_r时,这就是我得到的:

{{1}}

3 个答案:

答案 0 :(得分:6)

三元表达式:

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,并需要帮助找出他们在思考和/或未能考虑的地球上的内容。

答案 1 :(得分:1)

以下代码将评估为True,因此您的isset()查询将被取消:

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

这将返回True,因为字符串&#39;&lt; p&gt;&#39;是的。

试试这个:

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

答案 2 :(得分:1)

问题在于你的三元手术。你的三元运算符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'] : '';