我尝试使用foreach循环而不是while并抛出错误。我不明白为什么它在这种情况下不起作用的问题。请有人帮助我使用foreach,而不要在下面的代码中使用:
//MARK:- Programatically move to Next Page or Previous Page
//Your Desire index in Your UIViewController Array
let arr : [UIViewController] = [arrvc[1]]
pagecontroller.setViewControllers(arr,
direction: UIPageViewController.NavigationDirection.reverse,
animated: true,
completion: nil)
Foreach: tried but throwing errors
$r=$mysqli->query("SELECT * from category");
$row=$r->fetch_assoc();
foreach($row as $cat)
{?>
<tr class = "gradeX">
<td><?php echo $cat['cid'] ?></td>
<td><?php echo $cat['name'] ?></td>
<td><div class = "center"><a href = "#" class = "btn btn-primary btn-mini">Edit</a> <a href = "#" class = "btn btn-danger btn-mini">Delete</a></div></td>
</tr>
<?php }?>
While: Works perfectly
答案 0 :(得分:3)
让我们看看您的代码:
$row=$r->fetch_assoc();
foreach($row as $cat)
您在这里获取一行,然后在其上循环,因此$cat
是该行中字段的值。不是下一行。
因此,这样做并不奇怪
<td><?php echo $cat['cid'] ?></td>
和$cat = 'foo'
(必须假设foo是行中cid
的{{1}}列的值)看到。
错误:字符串偏移量'cid'
我们可以轻松地对此进行测试:
$row['cid'] = 'foo'
输出
//if we agree this is a simplified way of doing what you are doing
<?php
/*
$row = $r->fetch_assoc(); //['cid' => 'foo']
$cat = $row['cid']; //from foreach loop on $row
*/
$cat = 'foo'
?>
<td><?php echo $cat['cid'] ?></td>
完成时
<td><br />
<b>Warning</b>: Illegal string offset 'cid' in <b>[...][...]</b> on line <b>6</b><br />
f</td>
while($row=$r->fetch_assoc())
的值在每次迭代时都会更改,直到下一行。使用while循环遍历数据库结果是预期的方法。除非您获取所有结果然后遍历它们,否则在某些情况下效率会降低。
希望能使它更有意义。
答案 1 :(得分:1)
允许使用foreach
遍历记录集的另一种可能的方法是使用generator
类型的函数,该函数yields
行对象然后可以迭代通过。一个简单的示例,使用mysqli
连接:
function pre($data){/* only for display purposes */
printf('<pre>%s</pre>',print_r($data,true) );
}
function getrs( $obj ){/* the generator function that "yields" the row object */
for( $i=0; $i < $obj->num_rows; $i++ )yield $obj->fetch_assoc();
}
$sql='select * from sport order by rand() limit 100';
$res=$db->query( $sql );
foreach( getrs( $res ) as $rs )pre( $rs );
有关Generators的更多信息