supprimer les clés d'un array inexistant dans un autre array

galisurf
Invité n'ayant pas de compte PHPfrance

10 mai 2011, 11:13

Bonjour,

j'ai bien une solution à mon problème, mais je la trouve un peu lente.

J'ai un array contenant des contacts de type : $conts['idCont']['nom'], $conts['idCont']['prenom'] ...

Je veux modifier ce tableau pour modifier l'affichage, pour cela j'ai une chaine contenant les clés de $Conts[$idCont] que je souhaite garder : $Keys = "nom,prenom,telephone".
Cette chaîne est modifiable par l'utilisateur.

Voici ma solution :

Code : Tout sélectionner

foreach ( $Conts as $idCs => $Cs ) { $Keys = explode ( ',' , $Keys ); foreach ( $Keys as $Keys ) { $contacts[$idCs][$Keys] = $Cs[$Keys]; } echo 'les infos que je veux afficher pour simplifier'; }
J'imagine qu'il y a une solution plus rapide qui permet de supprimer les clés de $Conts[$idCont] qui ne sont pas présente dans les clés ou la chaîne $Keys.
Evidement pour simplier la chose je suis pas sous PHP 5 :non:


Merci pour votre aide.

Galisurf

Eléphanteau du PHP | 16 Messages

10 mai 2011, 11:27

J'ai fais une erreur dans mon message précédent
mon code est le suivant :

Code : Tout sélectionner

foreach ( $Conts as $idCs => $Cs ) { $Keys = explode ( ',' , $Keys ); foreach ( $Keys as $Keys ) { $contacts[$Keys] = $Cs[$Keys]; } echo '<p>'.$contacts['nom'].'</p>'; //exemple }

ViPHP
ViPHP | 2577 Messages

10 mai 2011, 12:04

Bonjour,

Si ton traitement a chargé les informations en mémoire, il n'est peut être pas nécessaire d'en dupliquer une partie. Rien ne t'empêche de faire le traitement avec celle que tu a déjà et d'ignorer les autres.

Je te conseille d'éviter d'utiliser les mêmes noms de variable pour des choses différentes.
$Keys= explode(',',$Keys); n'est pas très joli.
foreach($Keys as $Keys) ne doit pas marché

Mammouth du PHP | 672 Messages

10 mai 2011, 12:45

Bonjour.

Question con : Tu ne peux pas agir au moment du remplissage, au lieu de remplir puis de supprimer ?

Eléphanteau du PHP | 16 Messages

10 mai 2011, 13:30

Bonjour,

Merci pour vos réponses

Pour Masarini :
$Keys= explode(',',$Keys); n'est pas très joli.
foreach($Keys as $Keys) ne doit pas marché
ça fonction très bien. qu'est ce qui n'est pas très jolie ? tu mettrais quoi ?


Pour Macgawel
Oui évidement je peux agir sur le "remplissage" mais je trouve que ce n'est pas propre ça fait du if sur chaque ligne.
Néanmoins c'est peut être plus long à rédiger mais reste la solution la plus rapide à charger jusque là.
Ceci dit le temps de chargement de 1500 contacts avec un affichage à 250 lignes n'est pas énorme non plus mais bien 3 secondes ce qui n'est pas négligeable.

Donc Macgawel, oui c'est la solution mais j'aimerai trouver plus propre à mon goût #-o ,
ou alors comme actuellement j'agis directement sur la requête, seulement j'ai besoin d'utiliser le même tableau ailleurs contenant, cette fois, tous les champs.

ViPHP
ViPHP | 2577 Messages

10 mai 2011, 13:48

Bonjour,

$Keys= explode(',',$Keys); n'est pas très joli à cause du fait que $keys contient une chaine puis un tableau. Je reconnais que que c'est subjectif.

foreach($Keys as $Keys) ne doit pas marché car au second passage $keys ne contient plus le tableau initial mais le premier élément du tableau initial. Il me semble que dans un post de ce forum quelqu'un a résolu un problème en ne mettant plus le même nom.
Je préfère foreach($Keys as $Key).

Pour ce qui est du tableau, tu peux agir dans la liste des colonnes avec un "select nom,prenom,telephone from..."

A propos de "1500 contacts avec un affichage à 250 lignes" il est peut être plus judicieux d'utiliser les "limit" de mysql pour ne pas tout lire. Je ne connais pas trop les équivalents pour les autres SGBD.

Edit : le "utiliser ailleurs" signifie dans la même exécution ou uniquement l'utilisation d'une fonction ?

Eléphanteau du PHP | 16 Messages

10 mai 2011, 14:14

$Keys= explode(',',$Keys); n'est pas très joli à cause du fait que $keys contient une chaine puis un tableau. Je reconnais que que c'est subjectif.
C'est une chaine qui provient de la BDD pour que l'utilisateur puisse conserver son affichage à chaque reconnexion. Donc à la base j'ai une chaine contenant les champs à sélectionner dans la BDD
Je préfère foreach($Keys as $Key).
Je suis d'accord avec toi, d'ailleurs maintenant que j'y pense il est possible que j'ai vérifier que la première ligne à force de faire et défaire :roll:
Pour ce qui est du tableau, tu peux agir dans la liste des colonnes avec un "select nom,prenom,telephone from..."

Edit : le "utiliser ailleurs" signifie dans la même exécution ou uniquement l'utilisation d'une fonction ?
Oui c'est ce que je fais jusqu'à maintenant mais je cherche une autre solution pour utiliser une fonction dans deux exécutions différentes :wink:
Tu me diras, je n'ai qu'à modifier le SELECT en fonction de l'utilisation. Mais est ce la solution la plus adapté ?
A propos de "1500 contacts avec un affichage à 250 lignes" il est peut être plus judicieux d'utiliser les "limit" de mysql pour ne pas tout lire. Je ne connais pas trop les équivalents pour les autres SGBD.
J'imagine bien que ce doit être la solution la plus rapide mais je ne suis pas du tout alaise avec "LIMIT" :non:
Surtout que l'affichage par défaut ce fait sur 20 lignes. et qu'aujourd'hui le plus gros utilisateurs appelle 1500 contacts mais demain j'espère 15 000 et plus :P

Donc je dois créer une fonction qui agit directement sur la requête mysql #-o 8-|
:priere: A l'aide !!!! MDR!!! Bon ceci dit c'est en forgeant qu'on devient forgeron je crois !!!!
Je savais que j'y passerai un jour !lol! heureusement mon ami google est là et vous aussi :P

Merci beaucoup pour votre aide.

Eléphant du PHP | 275 Messages

10 mai 2011, 14:44

array_diff_key ?

Mammouth du PHP | 672 Messages

10 mai 2011, 14:45

Ceci dit le temps de chargement de 1500 contacts avec un affichage à 250 lignes n'est pas énorme non plus mais bien 3 secondes ce qui n'est pas négligeable.
:shock:
Ca me semble un peu beaucoup, ça... Tu devrais voir s'il n'y a pas un problème quelque part.

Eléphanteau du PHP | 16 Messages

10 mai 2011, 14:48

array_diff_key ?
Bonjour Popy,

cette fonction est disponible seulement depuis php 5.0

Mammouth du PHP | 672 Messages

10 mai 2011, 14:55

array_diff_key ?
Bonjour Popy,

cette fonction est disponible seulement depuis php 5.0
Yep.
Mais dans les commentaires il y a de spropositions d'implémentation pour PHP4...

Eléphanteau du PHP | 16 Messages

10 mai 2011, 15:00

Ca me semble un peu beaucoup, ça... Tu devrais voir s'il n'y a pas un problème quelque part.
c'est peut etre ma requête qui est lente alors ? j'ai un JOIN est ce lui qui pourrait ralentir ?

Eléphanteau du PHP | 16 Messages

10 mai 2011, 15:08

array_diff_key ?
Bonjour Popy,

cette fonction est disponible seulement depuis php 5.0
Yep.
Mais dans les commentaires il y a de spropositions d'implémentation pour PHP4...

Oups !!! Je n'avais pas vu, c'est intéressant, mais je pense que je vais creuser du côté de mysql qu'en penses tu ?