Как сделать «четкое» обнаружение в цикле foreach - PullRequest
0 голосов
/ 28 января 2011

В настоящее время у меня есть этот очень сложный запрос, который я зацикливаю, и я получаю что-то вроде этого:

Список вызовов:

TEAM A
  - Challenge 1

TEAM A
  - Challenge 4

TEAM A
  - Challege 6

И я хочу изменить что-то вроде:

TEAM A
  - Challenge 1
  - Challenge 4
  - Challenge 6

Мой вопрос таков: поскольку запрос очень сложный, возможно, я мог бы сделать это внутри цикла, но, если это так, как мы можем достичь чего-то подобного?

Могу ли я задать пример случая, чтобы я мог использовать его для решения этой проблемы?

Большое спасибо, MEM

ОБНОВЛЕНИЕ: Запрос является чем-токак это: Переведено:

public function listachallengesPendentes()
{
  $select = $this->getAdapter()->select();
  $select->from(array("e"=>"teams"),array('name'));
  $select->join(array("de"=>"challengeperteam"),"e.cod_team = de.cod_teamFk",array());
  $select->join(array("d"=>"challenges"),"d.cod_challenge = de.cod_challengeFk",array('title'));

  $select->columns(array("e.cod_team"
                         ,"name_team"=>"e.name"
          ,"d.cod_challenge"
          ,"name_challenge"=>"d.title"
          ,"d.details"
          ,"d.score"
          ,"category"=>"d.cod_categoryFk"
          ,"de.proof"
          ,"de.date_concluded"
          ,"de.cod_challenge_team"
       ));

$select->where("de.status = 0");
$select->order(array('e.cod_team DESC', 'de.cod_challenge_team DESC'));

 return $this->getAdapter()->fetchAll($select);
 }

Так что мне нужно добавить отдельную часть: s: D?

Foreach на самом деле довольно простой:

foreach ($challenges as $d){ 
//display the name:
echo $d['name_team']; 

...

}

ОБНОВЛЕНИЕ 2 Чистый запрос (не проверен):

SELECT e.name
,d.cod_team
,d.cod_challenge
,d.title
,d.details
,d.score
,de.proof
,de.date_concluded
,de.cod_challenge_team
FROM teams e
INNER JOIN challengeperteam de ON de.cod_teamFk = e.cod_team
INNER JOIN challenges d ON d.cod_challenge = de.cod_challengeFk
WHERE  de.status = 0 
ORDER BY  e.cod_team DESC, de.cod_challenge_team DESC;

Ответы [ 3 ]

1 голос
/ 28 января 2011

Что-то вроде:

$current_team = null;
foreach($challenges as $challenge){
    if($current_team != $challenge->team){
        $current_team = $challenge->team;
        echo $current_team, "\n";
    }
    echo $challenge->challenge_name, "\n";
}
1 голос
/ 28 января 2011

Вы можете сохранить результаты массива в многомерном массиве, например:

$query_Challenges = "SELECT `Team`,`Challenges` FROM YourTable";
$Challenges = mysql_query($query_Challenges, $dbconnection) or die(mysql_error());
$row_Challenges = mysql_fetch_assoc($Challenges);

$challengeResults = array();

do{
    if(!array_key_exists($row_Challenges['cod_team'])){
        $challengeResults[$row_Challenges['cod_team']] = array();
    }
    $challengeResults[$row_Challenges['cod_team']][] = $row_Challenges['cod_challenge_team'];
}while($row_Challenges = mysql_fetch_assoc($Challenges));

EDIT

Если посмотреть на оператор запроса, данные должны быть правильно отсортированы по предложению ORDER, поэтому, если вам просто не нужно повторно печатать команду, как показано в кодовом блоке 2, то что-то вроде:

$team = '';
do {
    if($team != $row_Challenges['cod_team']){
        echo "TEAM $row_Challenges['cod_team']<br/>";
        $team = $row_Challenges['cod_team'];
    }
    echo " - $row_Challenges['cod_challenge_team']<br />";
}while($row_Challenges = mysql_fetch_assoc($Challenges));

Вы можете легко заменить foreach для цикла do, если в качестве «текущей команды» используется переменная, а в выражении if используется «не печатать имя следующей команды, если оно не отличается от текущего имени команды». «

1 голос
/ 28 января 2011

На самом базовом уровне, т. Е. В цикле, вы можете просто определить, равна ли переменная TEAM A текущему (предыдущему) значению, и, если это так, не печатать ее во второй раз.Это зависит от сортировки результирующего набора по столбцу TEAM A.

Однако вы также можете сделать это в запросе SQL, поэтому, если вы можете предоставить текущий запрос SQL, я могу объяснить, как выобновите его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...