IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Fonctions sur les arrays


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Par défaut Fonctions sur les arrays
    Bonjour à toutes et tous,

    Je lis la doc depuis un petit moment mais je n'ai pas les idées claires : Voilà ma question
    Je dois comparer des tableaux entre eux ($activitesRecherchees, $activitesExclues et $activitesExercees).
    Plusieurs cas se présentent:
    Soit $activitesRecherchees et $activitesExercees ont au moins un élément en commun, je pense utiliser array_intersect()
    si c'est vrai alors je compare le résultat avec $activitesExclues au moyen de in_array()

    Soit il faut que tous les éléments de $activitesRecherchees soient présents dans $activitesExercees mais il peut y en avoir d'autres
    je pense utiliser array_diff()

    Soit il faut que tous les éléments de $activitesRecherchees soient TOUS présents dans $activitesExercees mais seulement ceux de $activitesRecherchees
    je pense utiliser ... ben là je ne sais plus trop

    J'aimerais votre avis et d'avance je vous remercie. D'autre part mes tableaux sont générés à partir de champs de base de données MySQL. Pensez vous qu'il soit possible d'obtenir les mêmes résultats en utilisant des requêtes ? laquelle des deux méthodes sera la plus performante ? Ci dessous mon code (il manque sûrement des accolades

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    if ( $resultat['demande_tout'] == 'off' AND $resultat['demande_seulement'] == 'off')
    // Si une des activités demandées correspond à l'activité exercée
    {
       if( array_intersect($activitesRecherchees, $activitesExercees) ) 
       {
          $new_array = array_intersect($activitesRecherchees, $activitesExercees);
          if ( array_intersect($new_array, $activitesExclues) ) 
          {
    	...
          }
          else 
          {
           ...
           }
       }
     
    		if ( $resultat['demande_tout'] == 'on' )
    		// Si toutes les activités demandées sont exercées
    		{
    			if( array_diff($activitesRecherchees, $activitesExercees) )
                            { ... }
    		}
    		if ( $resultat['demande_seulement'] == 'on' )
    		// Si toutes les activités demandées sont exercées et qu'il n'y en a pas d'autres
    		{
    			...
    		}

  2. #2
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 60
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Montre ton SQL ? Ca parait une bonne idée de faire ça dès SQL.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /*Soit $activitesRecherchees et $activitesExercees ont au moins un élément en commun*/
    SELECT ar.champ1, ar.champ2, ar.champ3
    FROM activite_recherchee ar
    WHERE EXISTS (
       SELECT ae.champ1, ae.champ2, ae.champ3
       FROM activite_exercee ae
       WHERE ae.champ1=ar.champ1
       AND ae.champ2=ar.champ2
       AND ae.champ3=ar.champ3
    )
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Par défaut
    Bonsoir Dendrite et merci de ton aide.
    J'ai deux tables
    une "demande" qui contient un champs 'activités recherchées' ( ex: bar/tabac/loto/pmu/presse ), un champs 'activités exclues (ex : hôtel/restaurant) ainsi que deux contraintes TOUT et SEULEMENT (contenu : on/off) la première spécifiant si on cherche toutes les activités plus éventuellement d'autres, la seconde si on cherche SEULEMENT les activités spécifiées dans la demande
    une "business" qui contient un champs 'activités exercées' (ex: bar/tabac/loto/pmu )
    Donc comme tu te doutes, l'objectif est de faire matcher une demande avec un business (et inversement) avec ces critères.
    Par exemple si je cherche un bar sans contrainte mais sans activité hôtel/restaurant : alors tous les business qui exercent l'activité bar sortent sauf les bar/hôtel/restaurant, les bar/restaurant/hôtel, les bar/hôtel et les bar/restaurant ou restaurant/bar ou hôtel/bar...
    si je cherche un bar tabac avec la contrainte TOUT alors je matche avec bar/tabac/+ n'importe quelle autre activité sauf les activités exclues
    si je cherche un bar tabac avec la contrainte SEULEMENT alors je matche avec bar/tabac/.
    Je me penche sur ton post précédent pour voir si j'arrive à en faire quelque chose.

  4. #4
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 60
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Oui, merci des explications. C'est assez clair maintenant.
    Et tu n'as pas d'identifiant unique ? Tu m'as cité tous les champs ? C'est toi qui a modélisé en base ? Est-il encore temps de changer cette modélisation ?
    Si je résume : tu me dis ceci :
    demande(recherchee, exclue, tout, seulement)
    business(exercee)

    Or, en base, il faudrait modéliser quelque chose dans ce goût là :

    service(id, libelle)
    1 bar
    2 tabac
    3 loto
    4 pmu
    5 presse
    6 hôtel
    7 restaurant
    8 pub


    business(id, business_nom, proprietaire_nom, proprietaire_prenom, adresse, cp)
    ex
    55, "Le chat perché", "CAVELIER", "Michel", "2 rue des Oies Blanches", "57 000"


    business_service(id,business_id,service_id)

    102, 55, 1
    103, 55, 2
    104, 55, 4

    Pour naviguer, tu utiliserais cette vue créée une seule fois :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create or replace view v_business as
    select b.id as business_id, b.business_nom, b.proprietaire_nom, b.proprietaire_prenom, b.adresse as business_adresse, b.cp as business_cp, 
    GROUP_CONCAT(s.libelle SEPARATOR "/" ) as services
    from business_service bs 
    inner join business b on bs.business_id=b.id
    inner join service s on bs.service_id=s.id
    group by bs.business_id;
     
    select * from v_business;

    Tandis que pour faire tes calculs pour une recherche, tu taperais tranquillement dans ta table business_service... avec les bons filtres de recherche directement :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select b.id as business_id, b.business_nom, GROUP_CONCAT(s.libelle SEPARATOR "/" ) as services
    from business_service bs 
    inner join business b on bs.business_id=b.id
    inner join service s on bs.service_id=s.id
    group by bs.business_id
    where bs.service_id in (1,2,3) and bs.service_id not in (6,7)
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Par défaut
    Bonjour Dentrite,
    Non je ne peux pas revenir sur la conception de la base (à moins de tout refaire ) et oui, il y a un identifiant unique pour chaque demande et chaque business. Je me penche sur tes suggestions et sur les tutos mySql pour essayer de comprendre comment "écrire" mes deux requêtes. Encore merci.

  6. #6
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 60
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Ah non, avec ce que tu as fait, la base n'est pas exploitable. En matière de base de données, le bon sens ne suffit pas.
    "Tout refaire" quand tes fondations sont mauvaises, c'est toujours une bonne idée. Surtout si ton site est appelé à fonctionner avec des vraies gens.
    Mais bon, tu feras avec des fonctions arrays PHP. On repart de ton premier message. Il faut maintenant que tu nous montres ce que contiennent tes tableaux PHP.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo '<pre>';
    print_r($activites_recherchees);
    echo '</pre>';
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par jmtrivia Voir le message
    ...je ne peux pas revenir sur la conception de la base (à moins de tout refaire)...
    Quand on regarde la conception de tes tables, on se dit que tu n'as pas fini de galérer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    varchar(3) DEFAULT 'off'
    ça complique inutilement le code PHP ($xxx == 'off')
    Alors qu'il suffit de 0 et 1 !
    Tu devrais réfléchir SÉRIEUSEMENT à la CONCEPTION et STRUCTURE de tes tables AVANT de te lancer dans le codage.
    Mais réfléchis vite !

    Il vaut mieux repartir sur des bases saines plutôt que galérer des heures/jours/mois et perdre tous ses cheveux...

Discussions similaires

  1. fonction trim sur les array de array
    Par billyrose dans le forum Langage
    Réponses: 2
    Dernier message: 14/07/2009, 13h24
  2. Fonction sur les chaines
    Par joquetino dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 22/11/2005, 23h31
  3. Fonctions sur les dates
    Par Neuromancien2 dans le forum Oracle
    Réponses: 4
    Dernier message: 12/10/2005, 11h13
  4. Réponses: 2
    Dernier message: 01/05/2004, 22h15
  5. [LG]Symbole # (dièse) et fonctions sur les chaînes
    Par James64 dans le forum Langage
    Réponses: 6
    Dernier message: 24/03/2004, 15h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo