0

我可以看到我想看到的输出,但有 2 个我无法理解的错误:

 Notice: Undefined offset: 0 in C:\wamp\www\dash\handle_dashim.php on line 23
 Notice: Trying to get property of non-object in C:\wamp\www\dash\handle_dashim.php on line 23

代码的重要部分:

//move the objects into array.
$dasharr=array();
$i=1;
while(($row = mysql_fetch_array($dashim))) { 
    $dasharr[$i]=new dash($row["name"],$row["msg"],$row["msg_date"],$row["votes"]);
    $i++;
}

//checks the object with the most votes.
$numofdash=count($dasharr); 
$mostvotes=$dasharr[$numofdash];
while($numofdash>0){
    if(($mostvotes->votes)<($dasharr[$numofdash-1]->votes)){ //line 23
    $mostvotes=$dasharr[$numofdash-1];
    }
    $numofdash--;
}


echo $mostvotes->name; //I can see the output that I want

?>
4

4 回答 4

1

$i=1在文件的顶部。

所以你的第一行是$dasharr[$i]哪个是$dasharr[1]和向上。所以在你的循环中的第一次$dasharr[1-0]$dasharr[0]将是未定义的。

于 2013-03-27T20:57:32.253 回答
0

你有:$dasharr[$numofdash-1]if $numofdashis 1 then you are references $dasharr[0]which is not set above in while loop.

于 2013-03-27T20:57:27.973 回答
0

$i从前 6 行代码中删除:

$dasharr=array();
while(($row = mysql_fetch_array($dashim))) { 
    $dasharr[] = new dash($row["name"],$row["msg"],$row["msg_date"],$row["votes"]);
}

由于所有数组索引都以 0 开头,而您以 1 开头,因此您的数组成为关联数组。这意味着,您应该使用例如foreach语句来枚举它。

例如,如果您有 5 行,您将拥有以下 $dasharr 结构:

[1] => dash object,
[2] => dash object,
[3] => dash object,
[4] => dash object,
[5] => dash object

同样,您的代码count($dasherr)5永远不会到达带有 index 的元素,5并且在您的情况下,您在请求带有 index 的元素时出错0

为了避免以后出现此类问题,请使用var_dump()函数进行调试。

于 2013-03-27T21:03:41.690 回答
0

回答

这两个通知都指的是同一个问题。您开始$dasharr从索引中分配索引,1这有点不寻常并且与编程约定不一致。然后你正在做一个向后的 while 循环测试while($numofdash > 0)并尝试检索$dasharr[$numofdash-1]哪个将是$dasharr[0](你没有设置的那个) when $numofdash = 1

您有两个快速解决此问题的方法:

  • 将您的 while 循环设置为进行$numofdash > 1测试
  • $dasharr0(建议)开始

其他调整

如果您打算遵循后者,您可以通过以下方式轻松删除$i变量的使用:

$dasharr = array();
while(($row = mysql_fetch_array($dashim)))
    $dasharr[] = new dash($row["name"], $row["msg"], $row["msg_date"], $row["votes"]);

符号将$a[] = ...对象推送到数组中最近的空索引(自动从 开始0)。

我还可以建议您在代码的最后一部分使用for循环而不是循环吗?while

$mostvotes = $dasharr[$numofdash];
for ($numofdash = count($dasharr); $numofdash > 0; $numofdash--)
    if(($mostvotes->votes) < ($dasharr[$numofdash-1]->votes))
        $mostvotes = $dasharr[$numofdash-1];
于 2013-03-27T21:07:22.207 回答