簡體   English   中英

PHP:甚至在檢查IsSet之后還有未定義的索引

[英]PHP: Undefined index even after checking IsSet

我已經閱讀了其他問題,沒有人回答也沒有幫助過我。

這是我的問題,我有一個對象/數組,其中包含一個屬性,也是一個對象/數組。

我之前成功訪問過類似的屬性:

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

三元表達式:

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個月內重新訪問它時,代碼將更加清晰。 大多數文本編輯器都使用括號和括號匹配突出顯示,因此添加括號是一種非常有用的方式來聲明並稍后查看操作的預期行為。

如果您遇到某人的隱秘代碼並需要幫助確定他們在思考和/或未能考慮的地球上的內容,請參閱運算符優先級

以下代碼將計算為True,因此您的isset()查詢將被否定:

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

這將返回True,因為字符串'<p>'為true。

嘗試這個:

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

問題在於你的三元手術。 你的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'] : '';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM