在这种情况下如何使用foreach循环

时间:2019-03-02 07:22:39

标签: php

我尝试使用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

2 个答案:

答案 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>

Sandbox

完成时

<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的更多信息