[RESOLU] foreach et array_push

Mammouth du PHP | 725 Messages

25 août 2013, 17:10

Bonjour,

Lorsque je verifie si un pseudo existe au sein d'une boucle, si un pseudo n'existait pas, je l'ajoute a un tableau:
foreach($to as $vpseudo){
    $memSQL = 'SELECT idm, LOWER(pseudo) FROM members_list WHERE pseudo = "'.$vpseudo.'"';	
    
// code 

    if($memRes) { // if found
        
        foreach($memRes as $memID) {
            $to_pseudo = $memID['idm'];
            
}
else {
    
        $listInvUsers = array();
        $list = array_push($listInvUsers, $vpseudo);
        $getUsers = implode('،', $listInvUsers);
        echo $getUsers;
}
}
Lors du print du resultat, ca donne la liste des pseudo sans virgule, exemple: pseudo1pseudo2pseudo3

Merci a vous

ViPHP
xTG
ViPHP | 7331 Messages

25 août 2013, 19:15

Quelle est la question et quel est ton problème ? :|

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

25 août 2013, 20:53

Le colonel moutarde dans la bibliothèque ?

Juste pour le code : pourquoi ne pas utiliser la clause SQL in et un implode pour construire la requête afin de n'en faire qu'une seule et optimiser un peu la chose ?

Ensuite si le but est de dédoublonner le tableau il existe une fonction php cela array_unique :D


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

Mammouth du PHP | 725 Messages

26 août 2013, 00:47

foreach($to as $vpseudo){
n'est pas une requete, c'est un tableau recu depuis un formulaire

ce que je cherche, est de verifier si un utilisateur existe, si oui c'est bon, sinon je le mets dans un tableau, et apres afficher le contenu du tableau (les pseudos qui n'existent pas dans la table):
// ouvrir un tableau
$listInvUsers = array();
        $list = array_push($listInvUsers, $vpseudo); // ajouter le pseudo
        $getUsers = implode('،', $listInvUsers); // mettre une virgule entre les pseudo
        echo $getUsers; // afficher le resultat
le resultat est sous forme: pseudo1pseudo2pseudo3

au lieu d'avoir quelque chose comme: pseudo1,pseudo2,pseudo3

voici le code complet, j'ai supprime des parties innutilisables:
<?php
$recepients 	= Isset($_POST['recepients'])	? strip_tags(strtolower($_POST['recepients']))                 : $recepients      = Null;
        
$to = explode(',', $recepients);

foreach($to as $vpseudo){
    
    $vpseudo = trim($vpseudo);
    
    $memSQL = 'SELECT idm, LOWER(pseudo) FROM members_list WHERE pseudo = "'.$vpseudo.'"';	
    $memReq = $connexion->query($memSQL);
    $memRes = $memReq->fetchAll();

    if($memRes) { // if found
        
        foreach($memRes as $memID) {
            $to_pseudo = $memID['idm'];
            
} // end foreach($memRes as $memID) {
} // end if($memRes) {
else {
    
        $listInvUsers = array();
        $list = array_push($listInvUsers, $vpseudo);
        $getUsers = implode('،', $listInvUsers);
        echo $getUsers;
} // end foreach($memRes as $memID) {
    } // end if($memRes) {

    
} // end foreach($to as $vpseudo){
?>

ViPHP
xTG
ViPHP | 7331 Messages

26 août 2013, 07:29

Tu n'as pas de virgule car en fait tu réinitialises à chaque itération de ta boucle foreach ton tableau à vide.
Donc ton affichage correspond à l'ajout dans un tableau vide :
Itération X : pseudo1
Itération X+1 : pseudo2
Itération X+2 : pseudo3

Ce qui donne à l'affichage : pseudo1pseudo2pseudo3 ;)

Si tu sors l'initialisation de la boucle tu obtiendras :
Itération X : pseudo1
Itération X+1 : pseudo1,pseudo2
Itération X+2 : pseudo1,pseudo2,pseudo3

Ce qui donne à l'affichage : pseudo1pseudo1,pseudo2pseudo1,pseudo2,pseudo3

La prochaine fois rajoutes un saut de ligne à la fin de tes variables de debug. ;)

Mammouth du PHP | 725 Messages

26 août 2013, 09:51

quand j'ai mis le code en dehors des boucles foreach(), j'obtenais rien :(
$listInvUsers = array();
        $list = array_push($listInvUsers, $vpseudo);

Mammouth du PHP | 725 Messages

26 août 2013, 10:00

j'ai remarque que le var_dump donne un resultat de plusieurs tableau sur mon premier code:

Code : Tout sélectionner

array(1) { [0]=> string(6) "pseudo1" } array(1) { [0]=> string(6) "pseudo2" } array(1) { [0]=> string(6) "pseudo3" }
donc le tableau prend la derniere occurance

ViPHP
xTG
ViPHP | 7331 Messages

26 août 2013, 11:56

Oui car réinitialisé à chaque itération. :)
Montres nous ta modification en dehors du foreach, si tu n'obtiens rien c'est que tu fais un truc de trop.

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

26 août 2013, 13:42

perso je trouve que tu ne complique la vie ;)

je ferais ainsi (à tester bien sur).
<?php
try {
    $connexion = new PDO('');

    if (!empty($_POST['recepients'])) {
        $_POST['recepients'] = strip_tags(strtolower($_POST['recepients']));
        if (substr_count($_POST['recepients'], ',') > 0) {
            $to = explode(',', $_POST['recepients']);

            $memSQL = 'SELECT idm, LOWER(pseudo) as pseudo FROM members_list WHERE pseudo in(';

            foreach ($to as $vpseudo) {
                $memSQL .= $connexion->quote(trim($vpseudo)) .' , ';
            }
            $memReq = $connexion->query($memSQL);
            if ($memReq === false) {
                $err = $connexion->errorInfo();
                throw new Exception($err[2]);
            }
            $dbpseudo = $memReq->fetchAll(PDO::FETCH_COLUMN, 'pseudo');
            $ids = $memReq->fetchAll(PDO::FETCH_COLUMN, 'idm');

            if ($dbpseudo === false) {
                $err = $memReq->errorInfo();
                throw new Exception($err[2]);
            }
            if ($ids === false) {
                $err = $memReq->errorInfo();
                throw new Exception($err[2]);
            }
            // on ferme proprement le curseur
            $memReq->closeCursor();
            foreach ($to as $p) {
                // si le pseudo courant n'est pas dans la liste récupérée de la base c'est qu'il n'existe pas 
                if (!in_array($p, $dbpseudo)) {
                    $pseudoKo[] = $p;
                }
            }
            if (!empty($pseudoKo)) {
                // des pseudo n'existe pas a toi de voir comment afficher la chose
            } else {
                // tous les pseudos entrés sont dans la base tu peux en faire ce que tu veux. 
                // $dbpseudo est un tableau contient les pseudos valide
                // $ids est un tableau qui contient les idm correspondants aux pseudos
                // la relation entre $dbpseudo et $ids c'est la clef des deux tableaux, l'id correspondant à $pseudo[28] et $ids[28]
            }
        }
    }
} catch (Exception $e) {
    // traitement de l'erreur
}
@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

27 août 2013, 00:44

c'est ce que je cherchais:
// des pseudo n'existe pas a toi de voir comment afficher la chose
comment les afficher en bon forme?

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

27 août 2013, 12:07

ben c'est toi qui vois :mrgreen:
$pseudoKo est un tableau donc un foreach est adapté pour le parcourir, ensuite l'affichage ça dépend de ton site.

tu peux, par exemple, faire ainsi
<?php
echo '<div class="avertissement erreur">
<h2>Les pseudos suivant n\'existe pas :<br />
<ul>';
foreach($pseudoKo as $p} {
echo '<li>'.$p.'</li>';
}
echo '</ul></div>';
@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

29 août 2013, 02:14

comme indiquer en haut, je recois 3 tableaux:

Code : Tout sélectionner

array(1) { [0]=> string(6) "pseudo1" } array(1) { [0]=> string(6) "pseudo2" } array(1) { [0]=> string(6) "pseudo3" }

ViPHP
xTG
ViPHP | 7331 Messages

29 août 2013, 08:14

Bah commences par corriger ce souci de conception. ;)

Mammouth du PHP | 725 Messages

29 août 2013, 08:58

est ce que c'est le travail de array_merge??

ViPHP
xTG
ViPHP | 7331 Messages

29 août 2013, 11:29

Non c'est le travail de placer correctement ce code :
$listInvUsers = array();