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

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    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 : 58
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    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 régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    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 : 58
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    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 régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    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 : 58
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    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
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    Par défaut
    Dans les activités recherchées, j'ai les activités séparées par des /
    je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $activitesRecherchees = explode( '/', $resultat['demande_activite'], -1 );
    C'est la même chose pour les activités exclues et les activités exercées.
    Pourquoi dis tu que la méthode SQL ne peut pas fonctionner ?

  8. #8
    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 : 58
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Essaie cela.
    Je n'ai pas testé.
    Et si ça te convient, il faudra que tu exploites ce que tu nommes les contraintes... Pour l'instant, on ne gère que recherchee et exclus :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    <?php
    //demande(id, recherchee, exclue, tout, seulement)
    //business(id, exercee)
    //demande(4,'bar','hotel/restaurant' ,'off','off')
    function retourne_recherche($pdo,$demande_id){
    	$sql='select recherchee, exclue,tout, seulement from demande where id=?';
    	$sth = $pdo->prepare($sql);
    	$sth->execute(array($demande_id));
    	$row = $sth->fetch(PDO::FETCH_ASSOC);
    	if(count($row)>0){
    		$like_sql='';
    		$not_like_sql='';
    		if($row['exclus']!=""){
    			$tab_exclus=explode('/',$row['exclus']);
    			if(count($tab_exclus)>0){
    				foreach($tab_exclus as $exclus){
    					$not_like_sql.=' exercee not like "%'.trim($exclus).'%" AND';
    				}
    				$not_like_sql=substr($not_like_sql, 0, -4);
    			}
    		}
    		if($row['recherchee']!=""){
    			$tab_recherche=explode('/',$row['recherche']);
    			if(count($tab_recherche)>0){
    				foreach($tab_recherche as $recherche){
    					$like_sql.=' exercee like "%'.$recherche.'%" AND';
    				}
    				$like_sql=substr($like_sql, 0, -4);
    			}
    		}
    		$requete='select id, exercee from business where ';
    		if($like_sql!='' && $not_like_sql!=''){
    			$requete.=$like_sql.' and '.$not_like_sql;
    		}
    		elseif($like_sql!=''){
    			$requete.=$like_sql;
    		}
    		elseif($not_like_sql!=''){
    			$requete.=$not_like_sql;
    		}
    		else{
    			$requete.='1';
    		}
    		$requete.=' order by exercee;';
    		echo $requete.'<br/>';
    		$sth = $pdo->prepare($requete);
    		$sth->execute();
    		$row = $sth->fetch(PDO::FETCH_ASSOC);
    		if(count($row)>0){
    			return $row;
    		}
    	}
    } 
    //et pour tester
    $options = array(
    	PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
    	PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    );
    $pdo = new PDO('mysql:host=localhost;dbname=ma_base', 'root', '', $options);	
    $data=retourne_recherche($pdo,4);
    echo '<pre>';
    print_r($data);
    echo '</pre>';
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  9. #9
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Je dois avouer ne pas avoir tout suivi, mais si j'ai bien compris le problème d'origine. On veut à partir d'une liste de recherches et d'une liste d'exclusions déterminer si la liste cible contient tous les éléments recherchés, aucun élément exclu, uniquement les éléments recherchés.
    Quelque chose comme ça avec les fonctions de tableaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $attendus_non_trouves = array_diff($recherches, $activites);
    $attendus_trouves = array_intersect($recherches, $activites);
    $exclus_trouves = array_intersect($exclus, $activites);
    $trouves_non_attendus = array_diff($activites, $recherches);
     
     
    $ok_au_moins_un_trouve = !empty($attendus_trouves);
    $ok_tout_trouve = empty($attendus_non_trouves);
    $ok_aucun_exclu = empty($exclus_trouves);
    $ok_tout_sauf_exclus = $ok_tout_trouve && $ok_aucun_exclu;
    $ok_seulement_recherches = $ok_tout_sauf_exclus && empty($trouves_non_attendus);
    Mais c'est sûr qu'avec une table de référence et des tables de liaisons ce serait beaucoup plus simple.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    Par défaut
    Bonjour Dentrite,

    Dans la conception de la base : j'ai une table (avec id) dans laquelle se trouve toutes les données 'uniques' pour un business et une table (avec id) dans laquelle se trouve toutes les données 'uniques' pour une demande. Chaque business a son id comme chaque demande a le sien. Cela suit le raisonnement suivant : Cette donnée est elle unique pour un business/demande ou pas ? Du coup, l'ensemble est assez "lisible". Je ne comprends pas pourquoi ce modèle perturbe le fait de traiter un 'match' avec mySQL...mais comme tu l'auras compris, je ne suis pas un pro, donc j'ai suivi les tutos proposés pour la conception des BDD.

    Pour info, voici le contenu des tables (extrait)
    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
    BUSINESS : 
    `idbbir_commerces` int(11) NOT NULL, (primaire, ai )
     ...
      `com_prix` int(11) DEFAULT '0',
     ...
      `com_mer` varchar(3) DEFAULT 'off',
      `com_ski` varchar(3) DEFAULT 'off',
      `com_sante` varchar(3) DEFAULT 'off',
      `com_logement` varchar(3) DEFAULT 'off',
     ...
      `com_activite` text, (item/item1/item2...)
     ...
    DEMANDES
    `idbbir_demande` int(11) NOT NULL, (primaire, ai )
    ...
      `demande_activite` text,
      `demande_tout` varchar(3) NOT NULL DEFAULT 'off',
      `demande_seulement` varchar(3) NOT NULL DEFAULT 'off',
      `demande_activite_exclue` text,
    ...
    Je n'ai pas encore essayé la requête proposée dans ton post suivant je te donnerais des nouvelles.

  11. #11
    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 : 58
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Je te conseille vraiment de lire et d'appliquer le précédent message de Célira...
    Tu as dit ne pas vouloir tout refaire... alors Celira te propose LA solution : (comme souvent, c'est une pointure).
    Elle répond à ta première demande, l'approche "tout régler en PHP". Elle est d'une simplicité redoutable que tu pourras probablement adapter facilement.
    Moi-même dès demain, je vais jouer avec quelques tableaux PHP et sa proposition, pour la vérifier.

    Tu peux souvent choisir plusieurs chemins en programmation. Plusieurs algorithmes, parfois ils se valent, parfois non. Parfois un algo est moins satisfaisant intellectuellement, mais parfaitement adapté à un débutant ! Il faut bien démarrer par le plus simple !
    Si tu veux te perfectionner en PHP, suis ta première idée. Si un jour tu veux te muscler en modélisation SQL, suis mes conseils.

    Je te réponds juste à cet aspect :

    Dans une table SQL, on ne met JAMAIS ce genre de données concaténées "bar/presse/pmu/tabac"... pour la bonne raison que quand on a 4 infos, on garde 4 infos séparées.
    Car autant PHP gérera facilement le fait de passer une variable de chaine en tableau (explode ou implode), autant SQL ne connait pas le concept de tableau... Pour la bonne raison qu'une table SQL offre bien autre chose qu'un tableau PHP.

    Une dernière remarque : 'demande_tout' est antinomique de 'demande_seulement' ? alors pourquoi faire 2 champs, c'est redondant. J'aurais fait un seul champ demande_type (de type enum) avec comme valeurs possibles 'est_inclus' ou 'est_strictement_egal' ou 'contient_au_moins_une_valeur' (ce qui se traduira dans l'ordre par : a compris dans b, a=b, a intersection b!=0

    Maintenant que c'est fait, assume que ta base SQL est conçue par un débutant, ça ne tuera personne. Laisse comme ça et monte en compétences en PHP, on ne peut pas tout faire à la fois.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  12. #12
    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...

  13. #13
    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 : 58
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Partons donc de ces tableaux PHP, tu y verras plus clair...
    Je suis juste partie du principe que tu acceptais de modifier ceci dans ta table demande, sans tout refaire !
    Une dernière remarque : 'demande_tout' est antinomique de 'demande_seulement' ? alors pourquoi faire 2 champs, c'est redondant. J'aurais fait un seul champ demande_type (de type enum) avec comme valeurs possibles 'est_inclus' ou 'est_strictement_egal' ou 'contient_au_moins_une_valeur'
    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
    $businesses = array(
    0 => array('id' => '100', 'activite' => 'bar/tabac'),
    1 => array('id' => '101', 'activite' => 'pmu/bar/tabac/presse'),
    2 => array('id' => '102', 'activite' => 'pmu/bar/dancing/karaoke/tabac/presse'),
    3 => array('id' => '103', 'activite' => 'pmu/bar/dancing/karaoke/tabac/presse/café'),
    4 => array('id' => '104', 'activite' => 'hotel/pmu/bar/dancing/karaoke/tabac/presse')
    );
    $demande1=array('id' => '12', 'activite' => 'pmu,bar,tabac,presse', 'type_demande' => 'est_inclus', 'est_exclus' => 'café/restaurant/pub/hotel');
    //doit retourner
    $matches = array(
    0 => array('id' => '101', 'activite' => 'pmu/bar/tabac/presse'),
    1 => array('id' => '102', 'activite' => 'pmu/bar/dancing/karaoke/tabac/presse')
    );
    $demande2=array('id' => '12', 'activite' => 'pmu,bar,tabac,presse', 'type_demande' => 'est_strictement_egal', 'est_exclus' => NULL);
    //doit retourner
    $matches = array(
    0 => array('id' => '101', 'activite' => 'pmu/bar/tabac/presse')
    );
    $demande3=array('id' => '12', 'activite' => 'pmu,bar,tabac,presse', 'type_demande' => 'contient_au_moins_une_valeur', 'est_exclus' => 'café/restaurant/pub/hotel');
    //doit retourner
    $matches = array(
    0 => array('id' => '100', 'activite' => 'bar/tabac'),
    1 => array('id' => '101', 'activite' => 'pmu/bar/tabac/presse'),
    2 => array('id' => '102', 'activite' => 'pmu/bar/dancing/karaoke/tabac/presse')
    );
    Au demeurant, tu noteras que si ton champ type_demande est à "strictement_egal", tu ne t'intéresses pas à "est_exclus", car "qui peut le plus peut le moins")...

    Je crois maintenant qu'en mixant ceci + quelques fonctions explode + l'algo de fond de Célira. Tu as toutes les billes ! Bon courage... Et n'hésite pas si tu es coincé.
    Et quand tout fonctionnera, tu n'auras plus qu'à brancher ta base qui te crée ces tableaux associatifs.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  14. #14
    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 : 58
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Bon JM, je me suis bien amusée ! Merci...
    demande 1 et demande 2 tournent parfaitement.
    A toi de finir la demande 3 !
    Ben oui, c'est quand même ton code à la fin !
    Et puis j'ai rencart...

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    <?php
    function recherche(array $businesses,array $demande){
       if(count($businesses)>0 && count($demande)>0){
          /*on réorganise toutes les chaines pour avoir des sous-tableaux exploitables au niveau des activités*/
          //le tableau des exclusions
          $exclusions=array();
          if($demande['est_exclus']!=""){
             $exclusions=explode(',',$demande['est_exclus']);
          }
          //Le tableau des demandes => ds
          $ds=explode(',',$demande['activite']);
          //le tableau des businesses (- les exclusions le cas échéant) => bs
          $bs=array();
          $i=0;
          if(count($exclusions)==0){
             foreach($businesses as $business){
                $bs[$i]['id']=$business['id'];
                $bs[$i]['activites']=explode('/',$business['activite']);
                $i++;
             }
          }
          else{
             foreach($businesses as $business){
                $activites=explode('/',$business['activite']);
                $same=array_intersect($activites,$exclusions);
                if(empty ($same)){
                   $bs[$i]['id']=$business['id'];
                   $bs[$i]['activites']=$activites;
                   $i++;
                }
             }
          }
     
          //on traite
          $matches=array();
          foreach($bs as $b){
             switch($demande['type_demande']){
                case 'est_strictement_egal':
                   $same = array_intersect($ds, $b['activites']);
                   if(count($same)==count($ds) && count($ds)==count($b['activites'])){
                      $matches[]=$b;
                   }
                break;
                case 'est_inclus':
                   $same = array_intersect($ds, $b['activites']);
                   if(count($same)==count($ds) && count($same)<=count($b['activites'])){
                      $matches[]=$b;
                   }
                break;
                case 'contient_au_moins_une_valeur':
     
                break;
                default:
                return false; 
             }
          }
          return $matches;
       }
       else{
          return false;
       }
    }
    $businesses = array(
    0 => array('id' => '100', 'activite' => 'bar/tabac'),
    1 => array('id' => '101', 'activite' => 'pmu/bar/tabac/presse'),
    2 => array('id' => '102', 'activite' => 'pmu/bar/dancing/karaoke/tabac/presse'),
    3 => array('id' => '103', 'activite' => 'pmu/bar/dancing/karaoke/tabac/presse/café'),
    4 => array('id' => '104', 'activite' => 'hotel/pmu/bar/dancing/karaoke/tabac/presse')
    );
    $demande1=array('id' => '12', 'activite' => 'pmu,bar,tabac,presse', 'type_demande' => 'est_inclus', 'est_exclus' => 'café,restaurant,pub,hotel');
    //doit retourner
    $matches = array(
    0 => array('id' => '101', 'activite' => 'pmu/bar/tabac/presse'),
    1 => array('id' => '102', 'activite' => 'pmu/bar/dancing/karaoke/tabac/presse')
    );
    $demande2=array('id' => '12', 'activite' => 'pmu,bar,tabac,presse', 'type_demande' => 'est_strictement_egal', 'est_exclus' => "");
    //doit retourner
    $matches = array(
    0 => array('id' => '101', 'activite' => 'pmu/bar/tabac/presse')
    );
    $demande3=array('id' => '12', 'activite' => 'pmu,bar,tabac,presse', 'type_demande' => 'contient_au_moins_une_valeur', 'est_exclus' => 'café,restaurant,pub,hotel');
    //doit retourner
    $matches = array(
    0 => array('id' => '100', 'activite' => 'bar/tabac'),
    1 => array('id' => '101', 'activite' => 'pmu/bar/tabac/presse'),
    2 => array('id' => '102', 'activite' => 'pmu/bar/dancing/karaoke/tabac/presse')
    );
    echo 'DEMANDE<pre>';
    print_r($demande2);
    echo '</pre>';
    $data=recherche($businesses,$demande2);
    if($data!==false){
       echo 'MATCHES<pre>';
       print_r($data);
       echo '</pre>';
    }
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    Par défaut
    Bonjour jreaux62,
    Merci de ton aide... la conception de cette base date de 2009 (ce qui n'excuse en rien les mauvais choix). C'est d'ailleurs la seule et unique base que j'ai conceptualisé, ceci explique cela sans doute. Pour les cheveux, pas de souci, je n'en ai plus depuis bien longtemps Chauve qui peut en quelque sorte ! Cela dit tu as raison, je galère.

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    Par défaut
    jreaux62 > je vais modifier les off en 0 et les on en 1 (tinyint ) ça ne représente pas autant de modification que ce que je croyais...Par contre pour les cheveux... c'est mort
    Concernant la structure de la base... Célira et Dentrite, vous me tourmentez . j'ai une table avec toutes les activités et quand je fais ma sélection, je stocke dans un champs de la Base en récupérant un tableau. je peux sans dommage:
    Créer une table stockant l'ID du business autant de fois qui y a d'activités avec en regard l'id de l'activité,
    par exemple
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TABLE activites_exercees (fk_id_business TINYINT NOT NULL, fk_id_activite TINYINT NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; -- ( TINYINT parce qu'il y a 202 activités enregistrées et qu'il serait surprenant de dépasser les 255)
    Créer une table stockant l'ID d'une demande autant de fois qui y a d'activités avec en regard l'id de l'activité recherchée.
    Créer une table stockant l'ID d'une demande autant de fois qui y a d'activités avec en regard l'id de l'activité exclue.

    Est ce que j'ai bien compris le sens de vos deux posts ? au moins chaque info sera stockée 'individuellement' ? La nouvelle structure ci-dessus correspond t elle à l'idée que vous vous faites de ce que je souhaite obtenir à terme ? Doit je ajouter un identifiant unique à ces tables ? Dentrite, ton rencard s'est il bien passé ? La réponse à cette question est optionnelle !, est ce que d'une manière générale, je dois penser aux requêtes durant la conception ou est ce que le principe directeur est une information par champs ou autre possibilité ?

Discussions similaires

  1. fonction trim sur les array de array
    Par billyrose dans le forum Langage
    Réponses: 2
    Dernier message: 14/07/2009, 12h24
  2. Fonction sur les chaines
    Par joquetino dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 22/11/2005, 22h31
  3. Fonctions sur les dates
    Par Neuromancien2 dans le forum Oracle
    Réponses: 4
    Dernier message: 12/10/2005, 10h13
  4. Réponses: 2
    Dernier message: 01/05/2004, 21h15
  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, 14h19

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