PHP foreach复制输出数据的最后一次迭代

时间:2013-04-18 22:20:56

标签: php arrays foreach iteration

非常感谢帮助人员。即使你发现一切都很好,你也给了我解决它的重要线索。

//解 清除第一个迭代过程,因为我计划在页面开始时完成所有操作,并将其移至主迭代。我真的不知道发生了什么,只是想知道引用变量,然后再重新使用它进行新的迭代。

继承人的工作代码:

foreach ($groups as $group) {                   
$group['games'] = db_getGamesElimbyGroup ($group['id']);
    $class_by_groupID = $group['id'];

foreach ($group['games'] as $game) {
   $game['players'] = db_getPlayerElimbyGames($game['id']);             
   $class_by_gameID = $game['id']; ?>
   <div class="group<?=$class_by_groupID?> game<?=$class_by_gameID?> item clearfix">

    <?  foreach ($game['players'] as $player) { ?>

            <div class="player box<?=$player['casa_fora']?> clearfix">
                <div class="thumb" style="background-image:url(<?=$home_path.$player['thumb']?>)"></div>
                <div class="name"><?=$player['nome']?></div>
                <div class="result"><?=$player['equipa_result']?></div>
            </div>

            <?  } ?>
       </div>

     <?}
 }

//解决方案结束 // NEW

在获取数组之前,我用它做了这个操作:

$groups = db_getCountGroupsElim();

foreach ($groups as &$group) {

   foreach ($group['games'] as &$game) {
      $game['players'] = db_getPlayerElimbyGames($game['id']);
   }
}

使用引用将查询结果添加到同一个数组中。如果按原样使用数组,或者JSON形式可以使用它。我怀疑它可能必须是使用引用和相同的变量名称?!

// OLD

我有一个阵列,有几个级别,主要是群组,游戏,玩家

团体游戏和游戏得到了玩家。

喜欢这样。

JSON

 [{"id":"9","name":"Oitavos","games":[{"id":"49","next_game_id":"58","players":[{"equipa_result":"0","casa_fora":"1","nome":"Lucas Neves Castro","thumb":"uploads\/1364040943\/thumb\/dsc01491.jpg","jogador_id":"2"},{"equipa_result":"1","casa_fora":"2","nome":"Jo\u00e3o Monteiro Ribeiro","thumb":"uploads\/1364249922\/thumb\/foto.png","jogador_id":"6"}]},{"id":"50","next_game_id":"58","players":[{"equipa_result":"1","casa_fora":"1","nome":"Lu\u00eds Salgado","thumb":"uploads\/1364229837\/thumb\/20130322171159.jpg","jogador_id":"1"},{"equipa_result":"0","casa_fora":"2","nome":"Pedro Fernandes","thumb":"uploads\/1364759964\/thumb\/sam_0255.jpg","jogador_id":"32"}]},{"id":"51","next_game_id":"59","players":[{"equipa_result":"1","casa_fora":"1","nome":"Pedro Costa","thumb":"uploads\/1364126670\/thumb\/pedro.jpg","jogador_id":"12"},{"equipa_result":"0","casa_fora":"2","nome":"Jos\u00e9 Vieira","thumb":"uploads\/1364134124\/thumb\/19084_540280705996807_1199242145_n.jpg","jogador_id":"13"}]},{"id":"52","next_game_id":"59","players":[{"equipa_result":"1","casa_fora":"1","nome":"Jos\u00e9 Peixoto","thumb":"uploads\/1364099591\/thumb\/foto.jpg","jogador_id":"10"},{"equipa_result":"0","casa_fora":"2","nome":"Pedro Sousa","thumb":"uploads\/1364150593\/thumb\/552121_566863856670835_1922080433_n.jpg","jogador_id":"16"}]},{"id":"53","next_game_id":"60","players":[{"equipa_result":"1","casa_fora":"1","nome":"Lu\u00eds Carvalho","thumb":"uploads\/1364150836\/thumb\/598590_119690038195872_1425120299_n.jpg","jogador_id":"17"},{"equipa_result":"0","casa_fora":"2","nome":"Jo\u00e3o Fernandes","thumb":"uploads\/1364171606\/thumb\/img_20130314_222526.jpg","jogador_id":"24"}]},{"id":"54","next_game_id":"60","players":[{"equipa_result":"1","casa_fora":"1","nome":"Patr\u00edcio Correia Santos","thumb":"uploads\/1364156207\/thumb\/dsc01877.jpg","jogador_id":"19"},{"equipa_result":"0","casa_fora":"2","nome":"Tiago Fernandes","thumb":"uploads\/1364171076\/thumb\/4232037_big.jpg","jogador_id":"23"}]},{"id":"55","next_game_id":"61","players":[{"equipa_result":"0","casa_fora":"1","nome":"Carlos Miguel Da Silva Lopes","thumb":"uploads\/1364217431\/thumb\/miguel1.jpg","jogador_id":"26"},{"equipa_result":"1","casa_fora":"2","nome":"Luis Silva","thumb":"uploads\/1364562821\/thumb\/177158_390926850971196_1987889821_o.jpg","jogador_id":"31"}]},{"id":"56","next_game_id":"61","players":[{"equipa_result":"0","casa_fora":"1","nome":"Tiago Teixeira Castro","thumb":"uploads\/1364220392\/thumb\/tiago.jpg","jogador_id":"27"},{"equipa_result":"1","casa_fora":"2","nome":"Hugo Pereira Castro","thumb":"uploads\/1364771622\/thumb\/263386_241332222564106_3344558_n.jpg","jogador_id":"29"}]}]},{"id":"10","name":"Quartos","games":[{"id":"58","next_game_id":"62","players":[{"equipa_result":"1","casa_fora":"1","nome":"Jo\u00e3o Monteiro Ribeiro","thumb":"uploads\/1364249922\/thumb\/foto.png","jogador_id":"6"},{"equipa_result":"0","casa_fora":"2","nome":"Lu\u00eds Salgado","thumb":"uploads\/1364229837\/thumb\/20130322171159.jpg","jogador_id":"1"}]},{"id":"59","next_game_id":"63","players":[{"equipa_result":"0","casa_fora":"1","nome":"Pedro Costa","thumb":"uploads\/1364126670\/thumb\/pedro.jpg","jogador_id":"12"},{"equipa_result":"1","casa_fora":"2","nome":"Jos\u00e9 Peixoto","thumb":"uploads\/1364099591\/thumb\/foto.jpg","jogador_id":"10"}]},{"id":"60","next_game_id":"62","players":[{"equipa_result":"1","casa_fora":"1","nome":"Patr\u00edcio Correia Santos","thumb":"uploads\/1364156207\/thumb\/dsc01877.jpg","jogador_id":"19"},{"equipa_result":"0","casa_fora":"2","nome":"Lu\u00eds Carvalho","thumb":"uploads\/1364150836\/thumb\/598590_119690038195872_1425120299_n.jpg","jogador_id":"17"}]},{"id":"61","next_game_id":"63","players":[{"equipa_result":"1","casa_fora":"1","nome":"Luis Silva","thumb":"uploads\/1364562821\/thumb\/177158_390926850971196_1987889821_o.jpg","jogador_id":"31"},{"equipa_result":"0","casa_fora":"2","nome":"Hugo Pereira Castro","thumb":"uploads\/1364771622\/thumb\/263386_241332222564106_3344558_n.jpg","jogador_id":"29"}]}]},{"id":"11","name":"Meias","games":[{"id":"62","next_game_id":"65","players":[{"equipa_result":"1","casa_fora":"1","nome":"Jo\u00e3o Monteiro Ribeiro","thumb":"uploads\/1364249922\/thumb\/foto.png","jogador_id":"6"},{"equipa_result":"0","casa_fora":"2","nome":"Patr\u00edcio Correia Santos","thumb":"uploads\/1364156207\/thumb\/dsc01877.jpg","jogador_id":"19"}]},{"id":"63","next_game_id":"65","players":[{"equipa_result":"0","casa_fora":"1","nome":"Jos\u00e9 Peixoto","thumb":"uploads\/1364099591\/thumb\/foto.jpg","jogador_id":"10"},{"equipa_result":"1","casa_fora":"2","nome":"Luis Silva","thumb":"uploads\/1364562821\/thumb\/177158_390926850971196_1987889821_o.jpg","jogador_id":"31"}]}]},{"id":"12","name":"3\u00ba e 4\u00ba","games":[{"id":"64","next_game_id":"0","players":[{"equipa_result":"0","casa_fora":"1","nome":"Patr\u00edcio Correia Santos","thumb":"uploads\/1364156207\/thumb\/dsc01877.jpg","jogador_id":"19"},{"equipa_result":"0","casa_fora":"2","nome":"Jos\u00e9 Peixoto","thumb":"uploads\/1364099591\/thumb\/foto.jpg","jogador_id":"10"}]}]},{"id":"13","name":"Final","games":[{"id":"65","next_game_id":"0","players":[{"equipa_result":"0","casa_fora":"1","nome":"Jo\u00e3o Monteiro Ribeiro","thumb":"uploads\/1364249922\/thumb\/foto.png","jogador_id":"6"},{"equipa_result":"0","casa_fora":"2","nome":"Luis Silva","thumb":"uploads\/1364562821\/thumb\/177158_390926850971196_1987889821_o.jpg","jogador_id":"31"}]}]}]

SAMPLE ARRAY

Array
(
[id] => 13
[name] => Final
[games] => Array
    (
        [0] => Array
            (
                [id] => 65
                [next_game_id] => 0
                [players] => Array
                    (
                        [0] => Array
                            (
                                [equipa_result] => 0
                                [casa_fora] => 1
                                [nome] => João Monteiro Ribeiro
                                [thumb] => uploads/1364249922/thumb/foto.png
                                [jogador_id] => 6
                            )

                        [1] => Array
                            (
                                [equipa_result] => 0
                                [casa_fora] => 2
                                [nome] => Luis Silva
                                [thumb] => uploads/1364562821/thumb/177158_390926850971196_1987889821_o.jpg
                                [jogador_id] => 31
                            )
                    )
            )
    )
)

我正在为每一个级别做一个foreach,创建可以使用css更容易设计风格的单个元素。

我的迭代是这样的:

foreach ($groups as $group) {                   

    $class_by_groupID = $group['id'];

foreach ($group['games'] as $game) {

   $class_by_gameID = $game['id']; ?>
   <div class="group<?=$class_by_groupID?> game<?=$class_by_gameID?> item clearfix">

    <?  foreach ($game['players'] as $player) { ?>

            <div class="player box<?=$player['casa_fora']?> clearfix">
                <div class="thumb" style="background-image:url(<?=$home_path.$player['thumb']?>)"></div>
                <div class="name"><?=$player['nome']?></div>
                <div class="result"><?=$player['equipa_result']?></div>
            </div>

            <?  } ?>
       </div>

     <?}
 }

好的,现在所有重要的代码都在这里,我在最后一组最后一场比赛的最后一个输出上得到了一个奇怪的结果。

这不是因为特定组,我试图修改数组以获得更少的结果,并且仍然是相同的最后重复输出。

所以我的上一个DIV,不是获取最后一条记录的数据,而是获得前一条记录,并且在两个HTML DIVS中重复,只是相同但重复。

非常欢迎任何提示或建议。

提前致谢。

3 个答案:

答案 0 :(得分:8)

参考的foreach是我的第一个想法,但由于你的原始代码没有显示它我没有提到它。

为了将来参考,在PHP的foreach函数文档中,您可以阅读:

  

警告

     

即使在foreach循环之后,$ value和最后一个数组元素的引用仍然存在。建议通过unset()来销毁它。

以下是如何解决问题的示例:

<?php
    $arr = array(1, 2, 3, 4);
    foreach ($arr as &$value) {
        $value = $value * 2;
    }
    // $arr is now array(2, 4, 6, 8)
    unset($value); // break the reference with the last element

答案 1 :(得分:0)

您可能会收到有线结果,但我可以告诉您的是,这不是因为您在问题中发布的内容:

<?php

$groups[] = array(
    'id'    => 13,
    'name'  => 'Final',
    'games' => array(
        array(
            'id'           => 65,
            'next_game_id' => 0,
            'players'      => array(
                array('equipa_result' => 0, 'casa_fora' => 1, 'nome' => 'João Monteiro Ribeiro', 'thumb' => 'uploads/1364249922/thumb/foto.png', 'jogador_id' => 6),
                array('equipa_result' => 0, 'casa_fora' => 2, 'nome' => 'Luis Silva', 'thumb' => 'uploads/1364562821/thumb/177158_390926850971196_1987889821_o.jpg', 'jogador_id' => 31),
            ),
        ),
    ),
);

$home_path = '';

foreach ($groups as $group) {

    $class_by_groupID = $group['id'];

    foreach ($group['games'] as $game) {

        $class_by_gameID = $game['id']; ?>
        <div class="group<?= $class_by_groupID ?> game<?= $class_by_gameID ?> item clearfix">

            <?php foreach ($game['players'] as $player) { ?>

                <div class="player box<?= $player['casa_fora'] ?> clearfix">
                    <div class="thumb" style="background-image:url(<?= $home_path . $player['thumb'] ?>)"></div>
                    <div class="name"><?= $player['nome'] ?></div>
                    <div class="result"><?= $player['equipa_result'] ?></div>
                </div>

            <?php } ?>
        </div>

    <?php
    } // foreach
}

该代码运行正常并输出:

<div class="group13 game65 item clearfix">


        <div class="player box1 clearfix">
            <div class="thumb" style="background-image:url(uploads/1364249922/thumb/foto.png)"></div>
            <div class="name">João Monteiro Ribeiro</div>
            <div class="result">0</div>
        </div>


        <div class="player box2 clearfix">
            <div class="thumb" style="background-image:url(uploads/1364562821/thumb/177158_390926850971196_1987889821_o.jpg)"></div>
            <div class="name">Luis Silva</div>
            <div class="result">0</div>
        </div>

            </div>

所以,无论你做错了什么,你都没有在你的问题中提出的代码/数据中。无论如何提示:不要使用短标签,而不是在此网站上说明您的代码时。另见:Are PHP short tags acceptable to use?

答案 2 :(得分:0)

只是看...代码看起来很好,但你的$ groups数组中可能有一个额外的记录,导致第二个循环的一次额外迭代。