2013-04-18 60 views
2

真的非常感谢帮助的人们。即使你发现一切都很好,你给了我重要的线索来解决它。PHP foreach重复输出数据的最后一次迭代

//解决方案 清除第一个迭代过程,因为我打算在页面开始时完成所有操作,并将其移至主迭代。我不知道到底发生了什么,只是有一个关于引用变量的线索,然后稍后重新使用它进行新的迭代。

继承人的工作代码:

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> 

    <?} 
} 

//端到端解决方案的 //新

之前获得数组我就与它这样操作:

$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"}]}]}] 

样本数组

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中重复,只是相同,但重复。

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

在此先感谢。

+0

能否请您粘贴数组作为JSON,所以我可以尝试调试你描述的问题?只需使用** echo json_encode($ groups)**。 –

+1

@Rolando Isidoro:您可以在下面找到该阵列的PHP代码。应该为你做这项工作。 – hakre

+0

@RolandoIsidoro我发布了请求的Json数据,谢谢。 – GFFR88PT

回答

5

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

以供将来参考,PHP的功能的foreach文档中你可以读到:

警告

参考$ value并且最后一个数组元素的甚至foreach循环后依然存在。建议通过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 
+0

没错!后来发现......感谢帖子!这将是我的问题的问题和解决方案。好工作... – GFFR88PT

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?

+0

Hi @hakre,感谢您的帮助。 事情是,这只是5组中的一组,也是24场比赛之一。 完整的JSON数据发布了,可否请您试一试?! 谢谢! – GFFR88PT

+0

@ GFFR88PT:仍然没有重复。看看你自己:http://eval.in/16784 – hakre

+0

非常感谢@hakvre,感谢你的解决方案!干杯 – GFFR88PT

0

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

+0

Nop,如果我print_r数组,我可以看到最后一条记录没有重复。即使数组发生变化也会发生...... – GFFR88PT

+0

非常感谢@CubCouper,感谢您的解决方案!欢呼声 – GFFR88PT