0

ネストされた 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;

$servers の 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) "" } }
4

1 に答える 1

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)反復する配列と各メンバーに異なる変数名を使用します

于 2012-12-29T15:30:59.387 に答える