Перебор 2 массивов и отображение значения один раз

#php #arrays

#php #массивы

Вопрос:

Я перебираю два массива (тренажерные залы и игры) и сравниваю значение $gym[‘id’] со значением $game[‘gym_id’]. Если два значения совпадают, я показываю дату и время игры, как показано ниже.

 <?php
$gyms = sw::shared()->gyms->getAll();
$games = sw::shared()->games->getAll();
?>

<?php foreach ($gyms as $gym) { ?>
    <?php foreach ($games as $game) { ?>
        <?php if ($game['gym_id'] == $gym['id']) { ?>
            <?php $match  ; ?>
            <?php echo $gym['gym_name']; ?><br>
            <?php echo $game['date']; ?> <?php echo $game['time']; ?><br>
        <?php } ?>
    <?php } ?>
<?php } ?>
 

Я также отображаю название тренажерного зала с помощью $gym[‘gym_name’], но я хочу, чтобы название тренажерного зала отображалось только один РАЗ, и если в этом тренажерном зале есть игры, это означает, что это будет выглядеть так:

 GYM 1 NAME
GAME 1 DATE GAME 1 TIME
GAME 2 DATE GAME 2 TIME
GAME 3 DATE GAME 3 TIME

GYM 2 NAME
GAME 4 DATE GAME 4 TIME
GAME 5 DATE GAME 5 TIME
GAME 6 DATE GAME 6 TIME
 

Как мне это переписать?

Комментарии:

1. повторите название тренажерного зала во внешнем цикле, а не во внутреннем.

2. Нет, потому что это показало бы все тренажерные залы, даже если в тренажерных залах им не назначены игры. Я хочу показывать только спортивные залы с играми.

3. Я думаю, он имеет в виду, повторяйте его только в конце, чтобы вы получили последний результат. Или установите значение, которое вы ищете, в другую переменную и повторите ЭТО.

4. Это похоже на то, что нормализованная база данных может решить очень быстро.

5. @cpcdev попробуйте проверить, есть ли в тренажерном зале игры, прежде чем

Ответ №1:

Попробуйте что-то вроде этого.

 <?php
$gyms = sw::shared()->gyms->getAll();
$games = sw::shared()->games->getAll();

function getGymGames($gym){
    $gymGames = array();
    foreach ($games as $game) {
        if ($game['gym_id'] == $gym['id']) {
            array_push($gymGames,$game);
        }
    }

    return $gymGames;
}

?>

<?php
    foreach ($gyms as $gym) {
        $gymGames = getGymGames($gym);
        if(count($gymGames) > 0){?>
            <?=$gym['gym_name'];?><br />
            <?foreach($gymGames as $game){
            $match  ;
            ?>
            <?= $game['date']; ?><br />
            <?= $game['time']; ?><br>
            <?}
        }
    }
?>
 

Ответ №2:

Я не совсем знаком с PHP, но почему бы не сделать логическое значение, чтобы указать, отображалось ли оно или нет, и переключить его после его отображения.

 <?php
$gyms = sw::shared()->gyms->getAll();
$games = sw::shared()->games->getAll();
?>

<?php foreach ($gyms as $gym) { ?>
 <?php $notDisplayed=true; ?>
<?php foreach ($games as $game) { ?>
    <?php if ($game['gym_id'] == $gym['id']) { ?>
        <?php $match  ; ?>
         <?php if($displayed) { ?> 
          <?php echo $gym['gym_name']; ?><br>
          <?php $notDisplayed=false;?>
        <?php } ?>
        <?php echo $game['date']; ?> <?php echo $game['time']; ?><br>
    <?php } ?>
<?php } ?>