2016-05-09 2 views
0

c'est un contenu de fichier texte qui sera la base de données bavardaitsauter mêmes dates en boucle foreach

vous: 02/05/2016 11:41:53 Salut

Muhammad: 02/05/2016 11:42:41 Salut

vous: 2016-05-02 11:43:33 Comment allez-vous?

Muhammad: 2016-05-02 14:44:56 Je vais bien!

c'est le code de boucle pour obtenir le contenu

<?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 
} 
?> 

Je veux la date du message apparaît une fois au-dessus des messages dans la même date

+0

S'il vous plaît envisager de stocker les données dans un autre format, par exemple JSON ou XML ... – Emil

+0

Ce que vous demandez vraiment est deux questions: 1) comment analyser une variable de chaîne '$ line' dans des champs séparés (utilisateur, date, heure, message), et 2) comment comparer la valeur d'un champ (date) à la valeur de l'enregistrement précédent. – spencer7593

Répondre

1

rappeler simplement que la date de la dernière utilisation, puis le comparer à celui $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; 
?> 
+0

vous l'avez fait le meilleur moyen :) merci – Muhamad

0

Essayez ceci:

$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 
} 
+0

Merci Cela a bien fonctionné – Muhamad

0

D'abord, vous pouvez utiliser l'affectation de liste pour diviser les composants en variables séparées:

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

Ensuite, vous pouvez utiliser une simple comparaison pour voir si la date est nouvelle:

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

Vous devez déclarer $last_date avant que la boucle, mais vous pouvez laisser sa valeur non définie.

+0

merci mais l'utilisateur pourrait être (XXX YYY) donc nous ne pouvons pas le faire – Muhamad