[RESOLU] Récupération de données dans une variable contenant un tableau.

Eléphant du PHP | 65 Messages

20 déc. 2017, 09:35

Bonjour,
Grâce à votre aide j'ai pu faire un code qui me permet de récupérer toutes les données dans un csv et mettre les intitulés des colonnes à la place des intitulés des lignes et vis versa afin d'en faire l'insertion en base.
Voici le code:

Code : Tout sélectionner

<h1>Gestion des compteurs d'eau</h1> <main> <?php $dossier = glob('csv/*'); // ou bien 'csv/*.[cC][sS][vV]' pour aussi limiter à l'extension csv if(!$nb_fichier = count($dossier)) echo "Il n'y a aucun fichier dans le dossier"; else echo "Il y a <strong>&nbsp;$nb_fichier&nbsp;</strong> fichier(s) dans le dossier"; ?> </main> <div id="rslt"> <ul> <?php foreach($dossier as $fichier) { printf('<li><a href="?fichier=%s">%s</a></li>', urlencode($fichier), pathinfo($fichier, PATHINFO_FILENAME)); } ?> </ul> </div> <?php if(!empty($_GET['fichier']) && in_array($fichier=$_GET['fichier'], $dossier)) { $tableau_gestantes = array(); ?> <div id="rslt"> <?php printf('<pre>Sélectionné: <a href="%s" target="_blank">%s</a><br>', $fichier, pathinfo($fichier, PATHINFO_FILENAME)); ?> </div> <?php $lignes = file($fichier); $dates_gestantes = array_filter(str_getcsv(implode(array_slice($lignes, 3, 1)), ';')); // les dates sont à la ligne 4 donc indice 3 $type_gestantes = array_shift($dates_gestantes); $heures_gestantes = array_slice($lignes, 4, 24); $prototype_gestantes = array_combine(array_merge(['id', 'type', 'date'], range(23, 0)), array_fill(0, 27, 0)); $prototype_gestantes['type'] = "'$type_gestantes'"; foreach($dates_gestantes as $i => $date_gestantes) { $tableau_gestantes[$i] = $prototype_gestantes; $date_gestantes = implode('-', array_reverse(explode('/', $date_gestantes))); $tableau_gestantes[$i]['date'] = "'$date_gestantes'"; } foreach($heures_gestantes as $ligne_gestantes) { $data_gestantes = str_getcsv($ligne_gestantes, ';'); $heure_gestantes = intval(array_shift($data_gestantes)); foreach($data_gestantes as $i => $nb_procs_gestantes) { if(!trim($nb_procs_gestantes)) continue; $tableau_gestantes[$i][$heure_gestantes] = intval($nb_procs_gestantes); } } foreach($tableau_gestantes as $ligne_gestantes) { $sql_gestantes[] = "\n(" . implode(', ', $ligne_gestantes) . ')'; } ?> <div id="rslt"> <?php $sql_gestantes = 'INSERT INTO releve VALUES </br>' . implode(',</br>', $sql_gestantes); echo $sql_gestantes."</br>"; echo '</pre>'; ?> <div id="rslt"> <?php }
Tout d'abord je souhaiterai parcourir mes variables à la fin car finalement il m'a été demandé de les retravailler avant l'insertion en base.
Plutôt que d'avoir les 23 colonnes des horaires il m'a été demandé de faire une seule colonne "temps" et une "valeur". Dans la "temps" je dois y mettre la concaténation de la "date" se trouvant dans le fichier csv et "l'heure" également dans ce fichier.
Pour cela je dois dans un premier temps parcourir ma variable, récupérer la date et l'heure, les convertir en champs DATE car ce sont des string et générer un champs "temps" qui serait de type timestamp.
Afin de parcourir ma variable j'ai bien essayé avec un foreach or elle n'est pas reconnu comme un array donc je ne peux pas la parcourir?
Merci pour votre aide.
Modifié en dernier par biddal le 20 déc. 2017, 12:56, modifié 1 fois.

Eléphant du PHP | 65 Messages

20 déc. 2017, 12:01

Dans un premier temps ce que je souhaite faire c'est juste de pouvoir parcourir mes variables à la fin afin d'y récupérer les données pour ensuite les convertir en date pour les dates et les horaires mais comment parcourir ces variables?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

20 déc. 2017, 12:46

J'ai rien compris à ton code qui est difficilement lisible, mais d'une façon générale pour parcourir facilement un ensemble de variables, le plus simple est de ne pas utiliser des noms différents auquel tu ajoutes le suffixe _1, _2, _3, mais d'utiliser des tableaux pour faire un foreach() dessus
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 65 Messages

20 déc. 2017, 12:59

Voilà j'ai grandement simplifié mon code qui est au final très court c'est juste qu'il se répété 10 ou 11 fois parce que j'ai 10 ou 11 tableaux différents dans mon fichier csv de base.
Justement mes données sont dans un tableau que j'affecte ensuite à une variable.
Et lorsque j'affiche ma variable à la fin cela fonctionne or désormais je voudrai pouvoir récupérer les données dans cette variable mais je ne vois aps comment faire.

Eléphant du PHP | 63 Messages

20 déc. 2017, 19:32

Hello. C'est un concept déjà plus simple que le précédent, on peut donc faire direct un nouveau $tableau sans devoir retravailler l'ancien $tableau.

Il n'y a que le numéro de la ligne des dates qui change entre les 10 ou 11 blocs de données ? Le "type" est bien renseigné dans chacun des blocs ? Le nombre de blocs est toujours le même ou si une petite équation sur count($lignes) est nécessaire ? Il y a aussi quelques questions dans le code ci-dessous... il est peut-être possible d'être autonome à partir d'ici, sinon il y a le forum pour plus de précision.

Code : Tout sélectionner

<h1>Gestion des compteurs d'eau</h1> <main> <?php $dossier = glob('csv/*'); // ou bien 'csv/*.[cC][sS][vV]' pour aussi limiter à l'extension csv if(!$nb_fichier = count($dossier)) echo "Il n'y a aucun fichier dans le dossier"; else echo "Il y a <strong>&nbsp;$nb_fichier&nbsp;</strong> fichier(s) dans le dossier"; ?> </main> <div id="rslt"> <ul> <?php foreach($dossier as $fichier) { printf('<li><a href="?fichier=%s">%s</a></li>', urlencode($fichier), pathinfo($fichier, PATHINFO_FILENAME)); } ?> </ul> </div> <?php if(!empty($_GET['fichier']) && in_array($fichier=$_GET['fichier'], $dossier)) { ?> <div id="rslt"> <?php printf('Sélectionné: <a href="%s" target="_blank">%s</a><br>', $fichier, pathinfo($fichier, PATHINFO_FILENAME)); ?> </div> <?php $lignes = file($fichier); // ICI la boucle pour éviter de répéter le même code 10 ou 11 fois // oui il faut déplacer l'initialisation de $tableau pour cette boucle globale $tableau = []; // comme tu as une version PHP acceptant [] comme alias de array() $dates = array_filter(str_getcsv($lignes[3], ';')); // les dates à la ligne 4 donc indice 3 $type = array_shift($dates); // pour enlever la colonne "type" des dates foreach($dates as $i => $date) { // changer jj/mm/aaaa en aaaa-mm-jj pour MySQL $dates[$i] = implode('-', array_reverse(explode('/', $date))); // un $pdo->quote($date) serait bien } $heures = array_slice($lignes, 4, 24); // les 24 lignes contenant les valeures de chacune des heures foreach($heures as $ligne_valeures) { $ligne_valeures = str_getcsv($ligne_valeures, ';'); $heure = intval(array_shift($ligne_valeures)); // enlever l'heure des valeures foreach($ligne_valeures as $i => $nb_procs) { if(!isset($dates[$i])) continue; // au cas où $tableau[] = [ // nouvelles colonnes ??? id, type, temps, valeur ??? 'id' => 'NULL', 'type' => "'$type'", // faudrait préférer $pdo->quote($type) ou une requête préparée 'temps' => sprintf("'%s %02d:00:00'", $dates[$i], $heure), 'valeur' => intval($nb_procs), ]; } } ?> <div id="rslt"><pre> <?php $sql = []; // j'avais oublié d'initialiser ce tableau, indispensable dans une boucle globale foreach($tableau as $insert) { // ordre id, type, temps, valeur $sql[] = "\n(" . implode(', ', $insert) . ')'; } // ne jamais mettre de <br> dans une requête SQL $sql = 'INSERT INTO releve (id, type, temps, valeur) VALUES ' . implode(',', $sql); // https://dev.mysql.com/doc/refman/5.7/en/packet-too-large.html // par défaut c'est 4 MB pour MySQL 5.7 mais peut-être aussi petit que 1 KB // SELECT @@max_allowed_packet // devrait retourner cette limite. sinon il y a aussi $strm->bindParam() d'un $strm = $pdo->prepare() echo strlen($sql), "<pre>$sql\n\n</pre>"; // $pdo->query($sql); // ICI sera la fin de la boucle globale pour éviter de répéter le même code 10 ou 11 fois ?> <div id="rslt"> <?php }
Bonne chance.

Mammouth du PHP | 1967 Messages

20 déc. 2017, 21:52

ceci
in_array($fichier=$_GET['fichier'], $dossier)
ca m'étonnerait que ca marche
in_array($_GET['fichier'], $dossier)
a plus de chance
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 63 Messages

20 déc. 2017, 23:07

Hello. C'est tout à fait fonctionnel en PHP, l'affectation sera fait à $fichier et ensuite la valeur de $fichier transmis à in_array() ce qui permet par la suite d'utiliser $fichier et non plus $_GET['fichier'] qui aura été validé par !empty($_GET['fichier']).
https://3v4l.org/PpCHH
affiche bien "b.csv OK", comme on peut aussi écrire $a = $b = $c = 13; et tous auront la valeur 13.

Eléphant du PHP | 65 Messages

21 déc. 2017, 09:15

Hello. C'est un concept déjà plus simple que le précédent, on peut donc faire direct un nouveau $tableau sans devoir retravailler l'ancien $tableau.

Il n'y a que le numéro de la ligne des dates qui change entre les 10 ou 11 blocs de données ? Le "type" est bien renseigné dans chacun des blocs ? Le nombre de blocs est toujours le même ou si une petite équation sur count($lignes) est nécessaire ? Il y a aussi quelques questions dans le code ci-dessous... il est peut-être possible d'être autonome à partir d'ici, sinon il y a le forum pour plus de précision.

Bonne chance.
Effectivement il n'y a que le numéro de ligne qui change. Le type est bien renseigné dans chaque bloc.
Le nombre de bloc est tout le temps le même.
J'y avais pensé au nouveau tableau mais je ne sais pas comment faire pour parcourir ma variable afin de stocker ce que'il y a dedans pour la mettre dasn le tableau.
Je vais continuer mes recherches.
Merci

Eléphant du PHP | 65 Messages

21 déc. 2017, 10:20

Je viens d'utiliser ton code cela fonctionne parfaitement merci beaucoup. Je ne comprend pas encore tout mais je vais bien me pencher dessus afin de comprendre.
JE regarde pour la boucle ensuite.
Encore merci