phploopsyiiforeach

Display two arrays in foreach loop in Php?


I want to display data in single foreach loop. I have two tables dailystats and monthlystats both of them have same columns like calls,minutes,incomingcalls etc Im using Yii PHP Framework Here is my controller

public function actionViewStats(){
    $model = new Company();
    $id = $_GET['id'];

    $modelMonthly = $model->getCompanyUsageMonthly($id);
    $modelDaily = $model->getCompanyUsageDaily($id);

    $this->renderPartial('/shared/_company_stats', array(
        'modelDaily' => $modelDaily,
        'modelMonthly'=>$modelMonthly
        ));
}

Here is my view of table.

       <?PHP  if(isset($modelMonthly) && sizeof($modelMonthly)!=0): ?>
            <div class="ibox-content col-md-12 col-xs-12">
                <div class="title col-md-2">
                    <h3>Current Usage</h3>
                </div>
                <div class="col-md-10">
                    <div class="col-md-12 col-xs-12">

                        <table class="table">
                            <thead>
                            <th>Minutes</th>
                            <th>Incoming Minutes</th>
                            <th>Calls</th>
                            <th>Incoming Calls</th>
                            </thead>
                            <tbody>
                            <?PHP
                            if(isset($modelMonthly)){
                                foreach($modelMonthly as $monthlystats){
                                    ?>
                                    <tr>

                                        <td><?php echo $monthlystats->minutes?></td>
                                        <td><?PHP echo $monthlystats->incoming_minutes; ?></td>

                                        <td><?PHP echo $monthlystats->calls; ?></td>
                                        <td><?PHP echo $monthlystats->incoming_calls; ?></td>

                                    </tr>
                                <?PHP } } ?>
                            </tbody>
                        </table>

                    </div>
                </div>
            </div>
        <?PHP endif;?>

This is showing only monthly stats modelMonthly but i want to show daily stats modelDaily too in the same foreach loop.. How do i do that? I have tried array_combine etc but unable to do it. Searched on SOF but unable to find solution for it.

My code above shows only Monthly stats like this

enter image description here

But I want to show like this below. I have already made the table but im not able to use both modelDaily and modelMonthly in same foreach loop. I have tried different things but unable to do it..

enter image description here

<?PHP
                                if(isset($modelMonthly)){
                                    foreach($modelMonthly as $usage){
                                        ?>
                                        <tr>

                                            <td><?php echo $usage->minutes?></td>
                                            <td><?PHP echo $usage->incoming_minutes; ?></td>

                                            <td><?PHP echo $usage->calls; ?></td>
                                            <td><?PHP echo $usage->incoming_calls; ?></td>

                                        </tr>
                                    <?PHP } } ?>

Solution

  • If both your arrays have numerical indexes, you can use a regular for loop:

    for ($i = 0; $i < max(count($modelMonthly), count($modelDaily)); $i) {
         if (isset($modelDaily[$i]) {
             // Add the daily columns
         } else {
             // Add as much empty columns
         }
         if (isset($modelMonthly[$i]) {
             // Add the monthly columns
         } else {
             // Add as much empty columns
         }
    }
    

    The next step is adding the required headers th in the thead, and adding the extra td inside the loop.


    Alternatively, you can create both table independantly, and position them using CSS. It is not in the scope of this question, but this is what I would recommend.