【问题标题】:Initiating the same loop with either a while or foreach statement使用 while 或 foreach 语句启动相同的循环
【发布时间】:2011-04-25 20:14:38
【问题描述】:

我在 php 中有如下代码:

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

// Do some stuff

}

其中 $q 是检索一组组成员的查询。但是,某些组的成员保存在 memcached 中,并且该 memcached 值作为 $mem_entry 存储在数组中。为此,我通常会执行以下操作

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

// Do some stuff

}

这就是问题所在。我不想让两个相同的代码块(//do some stuff 部分)嵌套在两个不同的循环中,因为在一种情况下我必须使用 mysql 作为循环,而另一个使用 memcached。有没有办法用while或foreach切换开始循环?换句话说,如果 $mem_entry 有一个非空值,则循环的第一行将是 foreach($mem_entry as $k => $r),或者如果它为空,则循环的第一行将是 while( $r = mysql_fetch_array($q))

编辑

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

【问题讨论】:

    标签: php mysql loops for-loop while-loop


    【解决方案1】:

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

    如果有办法按照你的建议进行切换,我不知道。

    【讨论】:

    • doSomeStuff 部分大约有 600 行代码,并且必须将大约 9 个变量设置为全局范围才能作为函数运行,其中 3 个是 mysql 链接。这种情况多次出现。将其作为函数运行对性能影响太大。
    • 哇。我受过训练,一个函数应该足够短以适合一个人的屏幕。也许解释代码必须有所不同,但我很难不认为在一些重构之后你可能会更快乐。
    • 另外,您可以将数据对象传递给 doSomeStuff(),而不是全球化变量。如果你需要 doSomeStuff 来设置一堆变量,你可以让它返回一个数据对象。如果它需要获取和设置一堆变量,你可以通过引用传入一个数据对象。 (需要明确的是,在 php 中,数据对象可能只是一个数组。)
    • 显然,我不知道你的代码,所以这些只是建议。如果他们没有帮助,我很抱歉。
    【解决方案2】:

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

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

    这个想法是只使用 foreach 循环来完成实际工作,如果 memcache 中没有任何内容,则使用 mysql 中的内容填充 mem_entry 数组,然后将其提供给您的 foreach 循环。

    【讨论】:

    • 我刚刚更新完我的帖子,说要做同样的事情。我突然想到我应该修改数组而不是循环 :) 我将此标记为正确答案,因为它包含代码。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-04-04
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 2015-05-19
    • 1970-01-01
    相关资源
    最近更新 更多