我想知道如何将以下代码转换为使用foreach
$query_select = "SELECT * FROM shouts ORDER BY id DESC LIMIT 8;";
$result_select = mysql_query($query_select) or die(mysql_error());
while($row = mysql_fetch_array($result_select)) {
$ename = stripslashes($row['name']);
$eemail = stripcslashes($row['email']);
$epost = stripslashes($row['post']);
$eid = $row['id'];
$grav_url = "http://www.gravatar.com/avatar.php?gravatar_id=".md5(strtolower($eemail))."&size=70";
echo ('<img src = "' . $grav_url . '" alt="Gravatar">'.'<br/>');
echo $eid . '<br/>';
echo $ename . '<br/>';
echo $eemail . '<br/>';
echo $epost . '<br/><br/><br/><br/>';
答案 0 :(得分:10)
您可以这样编码:
$query_select = "SELECT * FROM shouts ORDER BY id DESC LIMIT 8;";
$result_select = mysql_query($query_select) or die(mysql_error());
$rows = array();
while($row = mysql_fetch_array($result_select))
$rows[] = $row;
foreach($rows as $row){
$ename = stripslashes($row['name']);
$eemail = stripcslashes($row['email']);
$epost = stripslashes($row['post']);
$eid = $row['id'];
$grav_url = "http://www.gravatar.com/avatar.php?gravatar_id=".md5(strtolower($eemail))."&size=70";
echo ('<img src = "' . $grav_url . '" alt="Gravatar">'.'<br/>');
echo $eid . '<br/>';
echo $ename . '<br/>';
echo $eemail . '<br/>';
echo $epost . '<br/><br/><br/><br/>';
}
正如您所看到的,从mysql_fetch_array获取数据时仍需要循环
答案 1 :(得分:6)
没有一种好方法可以将其转换为foreach,因为mysql_fetch_array()
只是从$result_select
获取下一个结果。如果您真的想要预告,您可以先将所有结果拉入数组,执行以下操作:
$result_list = array();
while($row = mysql_fetch_array($result_select)) {
result_list[] = $row;
}
foreach($result_list as $row) {
...
}
但是我没有理由这样做 - 而你仍然必须使用while循环,由于mysql_fetch_array()
的工作方式,这是不可避免的。为什么使用foreach()这么重要?
编辑:如果这仅用于学习目的:您无法将其转换为foreach
。你必须有一个预先存在的数组才能使用foreach()
而不是while()
,而mysql_fetch_array()
每次调用都会获得一个结果 - foreach()
没有预先存在的数组迭代。
答案 2 :(得分:0)
要使用foreach
,您需要一个包含查询结果中每一行的数组。一些用于PHP的DB库提供了一个fetch_all
函数,它提供了一个合适的数组,但我找不到mysql
的一个(但是mysqli扩展名确实存在)。你当然可以写自己的,就像这样
function mysql_fetch_all($result) {
$rows = array();
while ($row = mysql_fetch_array($result)) {
$rows[] = $row;
}
return $rows;
}
但是我必须回应“为什么?”使用此函数,您将创建两个循环而不是一个循环,并且需要将整个结果集加载到内存中。对于足够大的结果集,这可能会成为严重的性能阻力。为了什么?
foreach (mysql_fetch_all($result) as $row)
VS
while ($row = mysql_fetch_array($result))
while
同样简洁,IMO更具可读性。
编辑还有另一种选择,但这很荒谬。您可以使用Iterator Interface
class MysqlResult implements Iterator {
private $rownum = 0;
private $numrows = 0;
private $result;
public function __construct($result) {
$this->result = $result;
$this->numrows = mysql_num_rows($result);
}
public function rewind() {
$this->rownum = 0;
}
public function current() {
mysql_data_seek($this->result, $this->rownum);
return mysql_fetch_array($this->result);
}
public function key() {
return $this->rownum;
}
public function next() {
$this->rownum++;
}
public function valid() {
return $this->rownum < $this->numrows ? true : false;
}
}
$rows = new MysqlResult(mysql_query($query_select));
foreach ($rows as $row) {
//code...
}
在这种情况下,MysqlResult
实例仅在请求时获取行,就像使用while
一样,但将其包装在一个漂亮的foreach-able包中。虽然你已经为自己保存了一个循环,但你已经增加了类实例化的开销和一系列函数调用,更不用说增加了大量的代码复杂性。
但你问过是否可以在不使用while
(或我想象的for
)的情况下完成。那么可以完成,就像那样。是否应该完成取决于你。
答案 3 :(得分:0)
使foreach
成为可能的最明显的方法包括在数组中实现整个结果集,这可能迟早会在内存方面杀死你。你需要转向迭代器来避免这个问题。见http://www.php.net/~helly/php/ext/spl/
答案 4 :(得分:0)
您可以这样做
$query_select = "SELECT * FROM shouts ORDER BY id DESC LIMIT 8;";
$result_select = mysql_query($query_select) or die(mysql_error());
foreach($result_select as $row){
$ename = stripslashes($row['name']);
$eemail = stripcslashes($row['email']);
$epost = stripslashes($row['post']);
$eid = $row['id'];
$grav_url = "http://www.gravatar.com/avatar.php?gravatar_id=".md5(strtolower($eemail))."&size=70";
echo ('<img src = "' . $grav_url . '" alt="Gravatar">'.'<br/>');
echo $eid . '<br/>';
echo $ename . '<br/>';
echo $eemail . '<br/>';
echo $epost . '<br/><br/><br/><br/>';
}