【问题标题】:PHP: Undefined index even after checking IsSetPHP:即使在检查 IsSet 之后也未定义索引
【发布时间】:2017-10-09 13:44:53
【问题描述】:

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

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

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

$variable[propertyObject][property]

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

代码如下:

$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
)

【问题讨论】:

  • (parentheses) 放在您的三元运算周围。可能是搞砸了。
  • @NiettheDarkAbsol 谢谢,但没用,最糟糕的是它通过了 isset 但突然说它是一个未定义的索引
  • 这是循环吗?尝试在echo 语句之前写isset($extensionData['Calories']) var_dump($extensionData['Calories']);
  • 我没有尝试内联,而是在函数的开头声明了一个变量,并以某种方式解决了它,非常奇怪。
  • @AnimaSola 请看下面我的回答

标签: php arrays indexing undefined-index


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

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

【讨论】:

  • 你是救命稻草,这个答案怎么没有得到很多赞?
  • @KhanShahrukh 很高兴你发现这很有用。至于赞成票,Stack Overflow 以神秘的方式运作:-p
【解决方案2】:

问题在于您的三元运算。您的 isset() 带有三元运算符有点混乱,您在与字符串连接时没有定义范围。您需要为三元运算添加括号并将字符串与运算隔离。代码的 ifstatement 与

相同
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'] : '';

【讨论】:

    【解决方案3】:

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

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

    这将返回 True,因为字符串 '

    ' 为真。

    试试这个:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多