回声空数组值返回“0”;未定义索引“;错误


Echoing empty array values returns "undefined index" error

我认为这是一个相对简单的问题。这是我想做的基本布局。

我有一个阵列

$polarity_array

数组的值是显示图像的HTML标记。

但是这些数组的一些值是空的,因为我执行了一个函数,该函数使任何数组值都不等于"此插槽中没有mod"(当他们提交东西时,表单中的下拉框选择)

然后我有一个heredoc,它会回显我的HTML页面,其中包含以下数组的值:

{$polarity_array['image_polarity1']}
{$polarity_array['image_polarity2']}
{$polarity_array['image_polarity3']}
{$polarity_array['image_polarity4']}
{$polarity_array['image_polarity5']}
{$polarity_array['image_polarity6']}
{$polarity_array['image_polarity7']}
{$polarity_array['image_polarity8']}

但由于有些值没有设置(未设置的值取决于用户最初提交的内容),我会出现"未定义索引"错误。

有更好的方法吗?

    <?php
include_once 'header.php';
require_once 'login_builds.php';
include_once 'functions.php';
//Connect to server
$db_server = mysql_connect($db_hostname, $db_username, $db_password);
//Select the database for build-related pages
mysql_select_db($db_database)
    or die("Unable to select database: " . mysql_error());
//Retrieve page variables from GET array for inital querying, decode them
$buildname = $_GET['buildname'];
$author = $_GET['author'];
$pageitem = sanitizeString(urldecode($buildname));
$pageauthor = sanitizeString(urldecode($author));
//Set variables for array query and object image retrieval
$query_info = "SELECT * FROM weapons WHERE buildname='$pageitem' AND author='$pageauthor'";
$info_result = mysql_query($query_info);
$info_array = mysql_fetch_array($info_result);
//Remove entries with no mod, and no polarity
/*
foreach($info_array as $key => $string)
{
    if($string == "n" || $string == "No mod in this slot")
    {
        unset($info_array[$key]);
    }
}
*/
$page_id = $info_array['id'];
$page_author = $info_array['author'];
$page_buildname = $info_array['buildname'];
$page_weapon = $info_array['weapon'];
$page_mod1 = $info_array['mod1'];
$page_mod2 = $info_array['mod2'];
$page_mod3 = $info_array['mod3'];
$page_mod4 = $info_array['mod4'];
$page_mod5 = $info_array['mod5'];
$page_mod6 = $info_array['mod6'];
$page_mod7 = $info_array['mod7'];
$page_mod8 = $info_array['mod8'];
$page_polarity1 = $info_array['polarity1'];
$page_polarity2 = $info_array['polarity2'];
$page_polarity3 = $info_array['polarity3'];
$page_polarity4 = $info_array['polarity4'];
$page_polarity5 = $info_array['polarity5'];
$page_polarity6 = $info_array['polarity6'];
$page_polarity7 = $info_array['polarity7'];
$page_polarity8 = $info_array['polarity8'];
$page_category = $info_array['category'];
$page_description = $info_array['description'];
$page_date = $info_array['date'];
$page_hidden = $info_array['hidden'];
//Check if the accessing user is the same as the page creator. If not, check if page is hidden. If page is hidden, redirect to index.php.
if($_SESSION['username'] != $page_author)
{
    if($page_hidden == y)
    {
    header("Location: index.php");
    }
}
//Retrieve Page Main Image
$page_main_image = convertImageMainPageWeapon($page_weapon);
//Set up mod and polarity associative arrays

$mod_array = array(
"image_mod1" =>     "$page_mod1",
"image_mod2" =>     "$page_mod2",
"image_mod3" =>     "$page_mod3",
"image_mod4" =>     "$page_mod4",
"image_mod5" =>     "$page_mod5",
"image_mod6" =>     "$page_mod6",
"image_mod7" =>     "$page_mod7",
"image_mod8" =>     "$page_mod8"
);
$polarity_array = array(
"image_polarity1" => "$page_polarity1",
"image_polarity2" => "$page_polarity2",
"image_polarity3" => "$page_polarity3",
"image_polarity4" => "$page_polarity4",
"image_polarity5" => "$page_polarity5",
"image_polarity6" => "$page_polarity6",
"image_polarity7" => "$page_polarity7",
"image_polarity8" => "$page_polarity8"
);
foreach($mod_array as $key => $string)
{
    if($string == "No mod in this slot")
    {
        unset($mod_array[$key]);
    }
}
foreach($polarity_array as $key => $string)
{
    if($string == "n")
    {
        unset($polarity_array[$key]);
    }
}
foreach($mod_array as &$string)
{
    if($string != "")
    {
    $string = convertImageMod($string);
    }
}
foreach($polarity_array as &$string)
{
    if($string != "")
    {
    $string = convertImagePolarity($string);
    }
}

echo<<<_END
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="en-us" http-equiv="Content-Language" />
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>Weapon Build Creator</title>
<link href="styles/main.css" rel="stylesheet" type="text/css" />
</head>
<body style="background-image: url('images/bg.jpg')">
<div id="form" style="form">
<div class="newsdiv">
    <br />
    <p class="title">$page_buildname <br />
    (ID: $page_id)</p>
    <p class="regular_text">Author: $page_author<br />
    Weapon: $page_weapon</p>
    <img class="center_image" src="$page_main_image"></img><br />
    <p class="mod_text"> MODS AND POLARITIES</p>
    <p class="regular_text"></p>
<?php
    for($i=1; $i<=8; $i++) {
    if(isset($polarity_array['image_polarity' . $i])) {
        echo $polarity_array['image_polarity' . $i];
    } else {
        echo "This slot is empty.";
    }
}
?>
    <p class="regular_text"> Description:</p>
    <div class="description_text_div"> &nbsp;$page_description<br />
        <br />
        <br />
        <br />
        <br />
        <br />
        <br />
        <br />
        <br />
    </div>
    <p class="regular_text">*comment section currently disabled for beta testing*</p>
    </div>
    <form action = "authenticate.php" class="regular_text" method="post">
        <div class="auto-style1">
            <p class="warning_text">
            <br />
        <br /></p>
        </div>
    </form>
</div>
</div>
</body>
</html>
_END;
?>

您必须检查索引是否存在,如下所示:

if(isset($polarity_array['image_polarity1'])) {
    echo $polarity_array['image_polarity1'];
} else {
    echo "This slot is empty.";
}

不过,我不确定你的例子中那些花括号是什么意思。

更好的是,使用数组在项目中循环:

for($i=1; $i<=8; $i++) {
    if(isset($polarity_array['image_polarity' . $i])) {
        echo $polarity_array['image_polarity' . $i];
    } else {
        echo "This slot is empty.";
    }
}

对数组元素调用unset()会删除它,从而更改数组的长度。这就是为什么你会遇到"未满负荷指数"错误的原因。

来自PHP数组手册:

unset($arr[5]); // This removes the element from the array

由于从$array中取消设置$key,因此可以使用foreach()仅显示当前存在的密钥。起初,我想使用像@MightyPork建议的for语句,但你必须知道元素的总数。通过这种方式,您只能使用现有的图元。

foreach($polarity_array as $key=>$value){
     echo $key."=".$value."<br>";
}