[RESOLU] Mauvais arguments implode???

Eléphanteau du PHP | 40 Messages

20 sept. 2016, 14:55

Hai hai

Donc ça fait 24h que je me torture à comprendre ce
Warning: implode(): Invalid arguments passed in /home/kpontif/Téléchargements/php/comptes.php on line 26
PHP Warning: implode(): Invalid arguments passed in /home/kpontif/Téléchargements/php/comptes.php on line 26
Voilà l'usage que j'en fais

Code : Tout sélectionner

function writeCSV($fileName, $tab) { $fileFd = fopen($fileName, "w"); foreach ($tab as $key => $val) { /* sleep(3); */ /* var_dump($val); */ fputs($fileFd, '"'.implode($val, '","')."\"\n"); } fclose($fileFd); }
Et voici la forme du contenu d'un $val
array(26) {
[0]=>
string(0) ""
[1]=>
string(0) ""
[2]=>
string(0) ""
[3]=>
string(0) ""
[4]=>
string(0) ""
[5]=>
string(15) "2MoRO Solutions"
[6]=>
string(0) ""
[7]=>
string(0) ""
[8]=>
string(0) ""
[9]=>
string(0) ""
[10]=>
string(0) ""
[11]=>
string(0) ""
[12]=>
string(0) ""
[13]=>
string(0) ""
[14]=>
string(0) ""
[15]=>
string(0) ""
[16]=>
string(0) ""
[17]=>
string(0) ""
[18]=>
string(0) ""
[19]=>
string(0) ""
[20]=>
string(0) ""
[21]=>
string(0) ""
[22]=>
string(0) ""
[23]=>
string(0) ""
[24]=>
string(9) "Qualified"
[25]=>
string(2) "34"
}
Je comprends vraiment pas le problème :roll:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

20 sept. 2016, 15:15

Bonjour,

Vérifies l'ordre dans lequel tu passes les arguments à la fonction implode(), le séparateur est en premier, le tableau en second :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

20 sept. 2016, 15:21

salut,

code test simple à partir de tes données
<?php
$val  = [0=> "",1=> "",2=> "",3=> "",4=> "",5=> "2MoRO Solutions",6=> "",7=> "",8=> "",9=> "",10=> "",11=> "",12=> "",13=> "",14=> "",15=> "",16=> "",17=> "",18=> "",19=> "",20=> "",21=> "",22=> "",23=> "",24=> "Qualified",25=> "34"];
echo implode('","', $val);
résultat
","","","","","2MoRO Solutions","","","","","","","","","","","","","","","","","","","Qualified","34

du coup est tu certain de ce que les données que tu indiques sont bien celle avant le fputs ?

J'ai le même message d'erreur que toi si je ne passe pas un tableau en paramètre (pour info les paramètres c'est $glue, $array dans la doc il est conseillé d'utiliser le sens de la doc).

je pense donc que ton foreach parcourt le tableau que tu indiques ?
si oui tu peux réduire un peu ta fonction
<?php
function writeCSV($fileName, $tab)
{
    file_put_contents($fileName, implode('","', $tab), FILE_APPEND | LOCK_EX);
}

@Ryle : en fait elle top cette fonction elle fonctionne dans les deux sens ;)

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 40 Messages

20 sept. 2016, 15:34

du coup est tu certain de ce que les données que tu indiques sont bien celle avant le fputs ?
Oui j'ai fais un var_dump pour vérifier
je pense donc que ton foreach parcourt le tableau que tu indiques ?
si oui tu peux réduire un peu ta fonction
<?php
function writeCSV($fileName, $tab)
{
    file_put_contents($fileName, implode('","', $tab), FILE_APPEND | LOCK_EX);
}
oui ça le parcourt mais $tab est un tableau de tableau :) c'est pour ça que j'implode chaque $val de $tab
@Ryle : en fait elle top cette fonction elle fonctionne dans les deux sens ;)
Oui, j'ai essayé dans les deux sens de toutes façons j'ai le même message

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

20 sept. 2016, 15:39

malheureusement php te dit le contraire.

tu as forcément un argument de foireux et comme ce n'est la "glue" c'est forcément le tableau.
As-tu un deboggeur ? (genre eclipse + xdebug) cela te permettra de suivre pas a pas ton code et regarder ce qui ne vas.
c'est peux qu'une seule ligne de $tab qui n'est pas un tableau.
ajout un if(is_array($val) avant l'insertion pour voir si tu as toujours le même message d'erreur (et un else pour afficher les lignes qui cause problème).

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 40 Messages

20 sept. 2016, 15:46

... j'aurai du afficher le n° des lignes dès le début je suis vraiment c** xD
Ca ne concerne que les 25 premiers $val qui sont en fait des chaines de caractères pour le nom de chaque champs csv des tableaux qui suivent...

Bon bah merci xD C'est la première fois que je touche au PHP et je dois retaper et peaufiner le code d'un stagiaire en tant que stagiaire o/

Du coup je vais garder ce "is_array", c'est pas mal :D

Code : Tout sélectionner

function writeCSV($fileName, $tab) { $fileFd = fopen($fileName, "w"); foreach ($tab as $key => $val) { if (is_array($val)) fputs($fileFd, "\"" . implode("\",\"", $val) . "\"\n"); } fclose($fileFd); }

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

20 sept. 2016, 16:43

au passage tu connais fputcsv ? (a priori non ;) )
tu te feras moins chi** et ce sera plus clair.

et la même chose sous forme objet avec SPL http://php.net/manual/fr/splfileobject.fputcsv.php

et vu que tu débute je t"invites a te conformer aux standards psr-1 et psr-2 pour ce qui est du "formatage" du code ;)

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 40 Messages

20 sept. 2016, 17:17

au passage tu connais fputcsv ? (a priori non ;) )
tu te feras moins chi** et ce sera plus clair.

et la même chose sous forme objet avec SPL http://php.net/manual/fr/splfileobject.fputcsv.php
Y a vraiment des fonctions pour tout en PHP ça change du C :D Thanks o/
EDIT: je viens de tester avec fputcsv, ça marche bien sauf qu'il ne met pas d'enclosure sur les champs vides :/
et vu que tu débute je t"invites a te conformer aux standards psr-1 et psr-2 pour ce qui est du "formatage" du code ;)

@+
Uuuurh je savais qu'une norme finirait par arriver xD