2011-12-29 5 views
0
$ips = file_get_contents($_SERVER['DOCUMENT_ROOT']."/visitors.txt"); 
$arr = explode(",",$ips); 

$today = strtotime(date('Y-m-d H:i:s')); 

for ($n = 0, $max = count($arr); $n <= $max; $n++) { 
$visArr = explode("#",$arr[$n]); 
$visDate = strtotime($visArr[1]); //$visArr[1] = 2011-12-27 14:10:45 
if($visDate < $today){ 
    unset ($arr[$n]); 
} 
} 
print_r($arr); //empty array! 

données stockées commetort Date de comparaison

xxx.xxx.xxx.xxx#2011-12-27 11:56:24, 

xxx.xxx.xxx.xxx#2011-12-28 11:56:24, 

le résultat est pas correct lorsque je ne compare pour la date de visiteur, puis-je savoir ce qui ne va pas avec elle?

EDIT: je fixe mon code et donne encore un tableau vide quand comparer deux !! Date aucun conseil??

+1

Dans la ligne 4, je vois $ arrr qui n'est jamais déclaré. –

+0

L'avez-vous parcouru pour vérifier quelle est la valeur de $ visDate? – liquorvicar

Répondre

0

Supprimer comma d'abord, puis strtotime

 

$visDate = strtotime(trim($visArr[1], ",")); 

 
0

Hummm ....

$today = strtotime(date("Y-m-d H:i:s")); 

Vous faites PHP générer un horodatage, le format à une chaîne, puis l'analyser en timestamp ... Pourquoi ne pas simplement avoir

$today = time(); 
+0

Cela rend le code difficile à lire et constitue un gaspillage évident de ressources, mais cela fonctionne réellement. –

+0

Je n'ai pas dit que ça ne marchait pas, mais oui, c'est un gaspillage de ressources. Ce genre de construction est généralement un signe de programmation de culte de cargaison. –

1

Il y a un lo t de mauvaises choses avec elle, mais voici les choses les plus évidentes:

  • $arr est en cours éclatés par ,\r\n signifie que les virgules ne sera plus dans aucun des éléments du tableau résultant, car délimiteurs sont mis au rebut (à moins que plus aux données que ce que vous avez publié à l'origine).
  • Vous n'utilisez pas réellement $key dans la première boucle foreach, donc vous devriez probablement l'omettre.
  • $arrr est constamment remplacé dans la première boucle, ce qui signifie qu'il ne contiendra que les données délimitées par des virgules du dernier élément de $arr lorsque la boucle est terminée. Parce que vos virgules de fin sont supprimés par l'appel précédent à explode(), cela est susceptible d'être un tableau de rien à ce stade.
  • Vous utilisez la fonction count() dans la deuxième condition de boucle. Le nombre ne change pas, alors vous devez mettre ce soit avant la boucle elle-même ou dans la première partie comme ceci:

    for ($n = 0, $max = count($arrr); $n <= $max; $n++) {

  • Vous utilisez <= dans la deuxième boucle, de sorte que vous faites une itération supplémentaire inutile. L'indice maximal pour un réseau de n éléments est n - 1. Vous devez utiliser < dans ce cas, parce que $arrr[count($arrr)] n'est pas défini.

+0

J'ai corrigé mon code mais donne quand même un tableau vide quand je compare deux dates! –

+0

Postez votre nouveau code s'il vous plaît, ou je ne peux pas vous aider. – FtDRbwLXw6

+0

J'ai modifié mon post, jetez un oeil! –

0

tout d'abord comme suggéré ici vous devez faire:

$today = time(); 

pour obtenir l'heure en secondes depuis Epoch.

Vous obtenez un tableau vide à la fin à cause de cette comparaison défectueuse:

if($visDate < $today) 

Cette condition renvoie toujours car $today variable contient le temps actuel et votre fichier journal des visiteurs a des dossiers de visiteurs historique qui est évidemment inférieur à l'horodatage actuel.

Si vous voulez juste votre tableau final à montrer aux visiteurs de dernières 24 heures seulement alors votre condiction devrait être:

if(($today-$visDate) > 86400) 

84600 est pas de secondes dans une journée.