M.M
M.M

Reputation: 162

skip same dates in foreach loop

this is a text file content which will be chatting database

you:2016-05-02 11:41:53 Hi

Muhammad:2016-05-02 11:42:41 Hi

you:2016-05-02 11:43:33 How are you ?

Muhammad:2016-05-02 14:44:56 I'm fine!

this is the code to loop to get content

<?php
$chat = file("members/cdn/1/chats/9188.txt");
foreach($chat as $line){
    $name = strchr($line,":",true);
    $message = explode(' ', substr(strchr($line,":"),1), 3);
    if(some thing){
    ?>
    <div>
      <!-- here i want to skip the same dates -->
      <?=$message[0];?>
    </div>
    <?php
    }
    ?>
    <div class="container">
      <div class="arrow">
        <div class="outer"></div>
        <div class="inner"></div>
      </div>
      <div class="message-body">
        <p><?=$message[2];?></p>
        <p class="message_time"><?=date("g:i a", strtotime($message[1]));?></p>
      </div>
    </div>
    <div class="spacer"></div>
    <?php
}
?>

I want the date of the message appear one time above of messages in the same date

Upvotes: 0

Views: 734

Answers (3)

RiggsFolly
RiggsFolly

Reputation: 94642

Simply remember that date you last used and then compare it to the one in $message[0]

<?php
$lastDate = NULL;

$chat = file("members/cdn/1/chats/9188.txt");
foreach($chat as $line) :
    $name = strchr($line,":",true);
    $message = explode(' ', substr(strchr($line,":"),1), 3);
    if($lastDate != $message[0]) :
        $lastDate = $message[0];
?>
    <div><?=$message[0];?></div>
<?php
    endif;
?>
    <div class="container">
      <div class="arrow">
        <div class="outer"></div>
        <div class="inner"></div>
      </div>
      <div class="message-body">
        <p><?=$message[2];?></p>
        <p class="message_time"><?=date("g:i a", strtotime($message[1]));?></p>
      </div>
    </div>
    <div class="spacer"></div>
<?php
endforeach;
?>

Upvotes: 1

Mark Reed
Mark Reed

Reputation: 95242

First, you can use list assignment to get the components split out into separate vars:

    list($user,$date,$time,$message) = explode(' ', substr(strchr($line,":"),1), 4);

Then you can use a simple comparison to see if the date is new:

    if ($date != $last_date) {
       $last_date = $date;
    ?><div><?=$date?></div><?php
    }

You should declare $last_date before the loop, but you can leave its value undefined.

Upvotes: 0

Dhara Parmar
Dhara Parmar

Reputation: 8101

Try this:

$prevDate[] = array();
foreach($chat as $line){
    $name = strchr($line,":",true);
    $message = explode(' ', substr(strchr($line,":"),1), 3);
    if(some thing){
    ?>
    <div>
      <!-- here i want to skip the same dates -->
      <?php 
        if(!in_array($message[0],$prevDate)) { // check if date exist in array - means displayed previously or not
          echo $message[0]; 
          $prevDate = $message[0]; // store date in array so that next time you can check whether it has been already displayed or not
        }
      ?>
    </div>
    <?php
    }
    ?>
    <div class="container">
      <div class="arrow">
        <div class="outer"></div>
        <div class="inner"></div>
      </div>
      <div class="message-body">
        <p><?=$message[2];?></p>
        <p class="message_time"><?=date("g:i a", strtotime($message[1]));?></p>
      </div>
    </div>
    <div class="spacer"></div>
    <?php
}

Upvotes: 0

Related Questions