Comment separer des valeurs index dans une variable csv

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 596 fois - Téléchargée 28 fois

Contenu du snippet

j'avais besoin d'une fonction permettant de separer les "valeurs" des "index" d'une variable passee en format CSV pour generer une query SQL.
en gros: on a 2 variables : $field="index,champs1,champs2" et $valeurs="1,t1,t2,2,t3,t4,3,t5,t6, ...".
Le but est donc de recuperer : $index=array ("1","2","3",..." et $val=array("t1","t2","t3","t4",...).

je ne sais pas si c'est clair ni si cela sera utile mais bon ... j'en avais besoin pour une requete SQL UPDATE...

Source / Exemple :


<?php

echo '<p style="font-size: 19px; font-weight: 700; text-decoration: underline;">Parsing of a comma delimited string to arrays</p>>';
echo 'On passe 2 variables, 1 avec le nom des champs, l\'autres avec les valeurs';
echo '<br />2 arrays sont retournes : <br /><li>$indexval contient les valeurs de l\'index (premiere colonne)</li>';
echo '<li>$val contient les valeurs du restant des colonnes</li>';
$tableField="index,field1,field2";
$tableValues="1i,field1-1,field1-2,2i,field2-1,field2-2,3i,field3-1,field3-2,4i,field4-1,field4-2";

$fields=explode(",",$tableField);  //on cree un array a partir des 2 variables en les separant au niveau des virgules
$values=explode(",",$tableValues);
$nf=count($fields);  // on compte le nombre de valeurs
$nv=count($values);

$indexval=array();  // on cree les 2 arrays pour le resultat final
$val=array();
for ($i=0;$i<$nv;$i+=$nf)
{
    $indexval[]=$values[$i]; //on recupere la valeur de l'index et on stocke
    for ($k=0;$k<$nf-1;$k++)
    {
        $l=$k+$i+1; //  +1 pour eviter la valeur de l'index
        $val[$k][]=$values[$l]; on recupere la valeur et on stocke
    }
    
}
echo '<p style="font-size: 17px; font-weight: 700; ">les 2 variables passees :';
echo '<pre>';
echo '<li>$tableField</li>';
print_r($tableField);
echo '<br /><li>$tableValues</li>';
print_r($tableValues);
echo '<p style="font-size: 17px; font-weight: 700; ">le resultat';
echo '<br /><li>$indexval</li>';
print_r($indexval);
echo '<br /><li>$val</li>';
print_r($val);
echo '</pre>';

// exemple d'utilisation pour creer une requete SQL UPDATE

$k=0;
foreach ($indexval as $index)
{
   $sql="UPDATE `table` SET ";
   $n=count($val);$i=0;
   while ($i<$n)
   {
     if ($i>0){$sql.=", ";}
     $sql.="`{$fields[$i+1]}` = '{$val[$i][$k]}'";
     $i++;
   }
   $sql.=" WHERE `{$fields[0]}` = '$index' LIMIT 1";
   echo "SQL : $sql<br />";
   $k++;
}
            

?>

Conclusion :


Il y a surement moyen de faire mieux ... ou plus rapide mais bon ...

A voir également

Ajouter un commentaire

Commentaires

Messages postés
84
Date d'inscription
mercredi 7 mai 2003
Statut
Membre
Dernière intervention
12 juin 2006

Exact, bonne idee ... mauvaise habitude de Perl ... j'en oublie les fonctions elementaires...

Je corrige de suite ...

Merci...
Messages postés
134
Date d'inscription
samedi 19 octobre 2002
Statut
Membre
Dernière intervention
3 janvier 2009

Slt !

Beau travail !

Tu utilise split, Mais tu n'as pas d'expressions rationnelles donc pour faire gagné du temps à ton script utilise explode !
Messages postés
84
Date d'inscription
mercredi 7 mai 2003
Statut
Membre
Dernière intervention
12 juin 2006

Bonne idee ... je change mes classes et je met a jour ...
Merci.
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
Salut,

tu peux optimiser ton "for ($i=0;$i<count($val);$i++)"

$nb=count($val);
for($i=0;$i<$nb;$i++)
{

}

et tu peux mettre un while ça ira encore plus vite qu'un for ;-)

a +

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (galadriann)