Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用while或foreach语句启动相同的循环_Php_Mysql_Loops_For Loop_While Loop - Fatal编程技术网

Php 使用while或foreach语句启动相同的循环

Php 使用while或foreach语句启动相同的循环,php,mysql,loops,for-loop,while-loop,Php,Mysql,Loops,For Loop,While Loop,我用php编写了如下代码: while($r = mysql_fetch_array($q)) { // Do some stuff } 其中,$q是检索一组组组成员的查询。但是,某些组的成员保存在memcached中,memcached值作为$mem_条目存储在数组中。为了解决这个问题,我通常会做以下几点 foreach($mem_entry as $k => $r) { // Do some stuff } 问题出在这里。我不想在两个不同的循环中嵌套两个相同的代码块(//d

我用php编写了如下代码:

while($r = mysql_fetch_array($q))
{

// Do some stuff

}
其中,$q是检索一组组组成员的查询。但是,某些组的成员保存在memcached中,memcached值作为$mem_条目存储在数组中。为了解决这个问题,我通常会做以下几点

foreach($mem_entry as $k => $r)
{

// Do some stuff

}
问题出在这里。我不想在两个不同的循环中嵌套两个相同的代码块(//do some stuff部分),因为在一个循环中我必须使用mysql,而在另一个循环中必须使用memcached。有什么方法可以用while或foreach切换开始循环吗?换句话说,如果$mem_条目具有非空值,则循环的第一行将是foreach($k=>$r),或者如果它为空,则循环的第一行将是while($r=mysql_fetch_array($q))

编辑


嗯,在我写这篇文章几秒钟后,我终于想出了解决办法。我想我会把这个留给可能遇到这个问题的其他人。我首先将$members的值设置为memcached值。如果为空,则运行mysql查询并使用while循环将所有记录传输到名为$members的数组中。然后,我使用foreach($k=>r)启动循环。基本上,我每次都使用foreach循环,但是$members的值根据memcached中是否存在它的值而设置不同。

为什么不将doSomeStuff()重构为一个从每个循环中调用的函数呢。是的,您需要查看这是否会导致性能下降,但除非这很重要,否则这是一种避免代码重复的简单方法


如果有你建议的切换方法,我不知道。

不是理想的解决方案,但我会给你我的2美分。理想情况是调用函数,但如果不想这样做,可以尝试以下方法:

if(!isset($mem_entry)){
 $mem_entry = array();
 while($r = mysql_fetch_array($q))
 {

   $mem_entry[] = $r;

 }
}

我们的想法是只使用foreach循环来完成实际工作,如果memcache中没有任何内容,那么用mysql中的内容填充mem_条目数组,然后将其馈送到foreach循环。

doSomeStuff部分大约有600行代码,必须将大约9个变量设置为全局范围才能作为函数运行,其中3个是mysql链接。这种情况多次发生。将其作为函数运行对性能太不利了。我接受的训练是,一个函数应该足够短,可以放在屏幕上。对于解释代码来说,可能必须有所不同,但我很难不认为重构后您会更高兴。此外,您可以将数据对象传递给doSomeStuff(),而不是全局化变量。如果需要doSomeStuff设置一组变量,可以让它返回一个数据对象。如果需要获取和设置一组变量,可以通过引用传入数据对象。(需要明确的是,在php中,数据对象可能只是一个数组。)显然,我不知道您的代码,所以这些只是建议。如果没有帮助,我很抱歉。我刚刚更新完我的帖子,说要做同样的事情。我突然想到我应该修改数组而不是循环:)我将此标记为正确答案,因为它包含代码。非常感谢。