我的高度嵌套的foreach逻辑仅在第一次迭代时起作用

时间:2012-12-29 15:23:10

标签: php

我有一些嵌套的foreach循环,我得到了有趣和意想不到的结果。

在我下面的示例代码中的第9行,我循环“$ servers as $ server”并且在主循环的第一次迭代中,一切正常,我得到了预期的服务器列表,但是对于后续的迭代,我没有。

第7行的条件会在“if($ synced ['video_id'] == $ v ['id'])”的情况下保持返回true。

这让我问 - 我称之为$ servers的数组 - 它是在第一次迭代后以某种方式用完的,还是我需要因某种原因再次将它重置回位置0?

    //create array of servers synced with this video, also count them for later percentage readout.
    foreach ($videos as &$v) {
        $syncArray = Array();
        $i = 0;
        foreach ($synced as $synced) {
            //find whether sync-entity pertains to this video
            if ($synced['video_id'] == $v['id']) {
                //now get name of synched server instead of id
                foreach($servers as $server) {
                    if ( $synced['server_id'] == $server['id'] ) {
                        $syncArray[$i] = $server['screenName'];
                        //if servers screen has a parent, put that in parenthesis for clarity
                        if ($server['screenParent']) {
                            $syncArray[$i] .= " (". $server['screenParent'] .")";
                        }                           
                    }
                }
                //increment for calculating percentage later
                $i++;
            }
        }
        //append the array of synced servers for this video to the videoarray
        $v['syncArray'] = $syncArray;

$ server的var_dump:

array(3) {
[0]=> array(4) { ["id"]=> int(9) ["userName"]=> string(20) "företag1/testskärm" ["screenName"]=> string(9) "Gate C 22" ["screenParent"]=> string(10) "Terminal 5" }
[1]=> array(4) { ["id"]=> int(15) ["userName"]=> string(15) "företag1/entre" ["screenName"]=> string(6) "Entré" ["screenParent"]=> string(14) "Avgångshallen" }
[2]=> array(4) { ["id"]=> int(17) ["userName"]=> string(14) "företag1/test" ["screenName"]=> string(4) "test" ["screenParent"]=> string(0) "" } }

1 个答案:

答案 0 :(得分:2)

您的代码是一个很好的例子,为什么编程语言允许您编写函数和对象。

例如,这看起来如何?

//create array of servers synced with this video, also count them for later percentage readout.
foreach ($videos as &$v) {
    $v['syncArray'] = get_synched_video_array_by_id($synched, $v['id']);
}

这是嵌套foreach操作的第一级。现在想象下一个级别。见http://php.net/functions

您拥有的嵌套处理和条件越少,代码就越不复杂。降低复杂性可以减少可能发生的错误数量以及跟踪这些错误的难度。

这也应该可以轻松解决变量重复使用的具体问题(引用 Asad ):

  

foreach ($synced as $synced)为要迭代的数组和每个成员使用不同的变量名称