1. #1
    Membre du Club
    Profil pro
    Inscrit en
    octobre 2006
    Messages
    674
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2006
    Messages : 674
    Points : 47
    Points
    47

    Par défaut In_array Recherche plusieurs colonne

    Bonjour à tous,


    J'ai un array que j'alimente avec des données mysql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach($daterangeperiodeconges as $dateperiodeconges){
      $listedateperiodeconges[]= $dateperiodeconges;
     
    }
    Et j'ai un in_array pour recherche dedans.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      if (in_array($data, $listedateperiodeconges)) 
      {
        echo "class=\"cp\">cp";
      }
      else	
      {
        echo "class=\"travail\">";
      }
    Ca fonctionne

    Par contre dans mon array je voudrais rajouter 2 colonnes en plus .
    Mon array serait: Date|valeur_ID|0/1



    Par contre avec in_array je voudrait toujours pouvoir rechercher (la valeur rechercher serait toujours la premier colonne (date) et récuperer les valeurs des colonnes 2 et 3. Est-ce réalisable ?

    merci d'avance pour vos conseils et méthodes

    guigui69

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    juillet 2005
    Messages
    28 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juillet 2005
    Messages : 28 562
    Points : 42 475
    Points
    42 475

    Par défaut

    Si tu n'as pas de doublons de date, met la en index du tableau et fait le contrôle avec isset(); en plus c'est beaucoup plus rapide

    foreach($daterangeperiodeconges as $dateperiodeconges){
    $listedateperiodeconges[$dateperiodeconges]= array(cequetuveux);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(isset($listedateperiodeconges($data)) {
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    octobre 2006
    Messages
    674
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2006
    Messages : 674
    Points : 47
    Points
    47

    Par défaut

    Bonjour Sabotage,

    merci pour tes conseils,

    Donc normalement il y a pas de doublon car dans ma base mysql il récupérer début et fin des congés et il liste les date entre ces deux dates.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $listedateperiodeconges[$dateperiodeconges]= array(cequetuveux);
    dans le array(cequetuveux) je suis limité en colonne ?

    guigui69

  4. #4
    Membre éprouvé Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    septembre 2002
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : septembre 2002
    Messages : 765
    Points : 1 208
    Points
    1 208

    Par défaut

    Non. Tu n'es pas limité. A la rigueur, les données extraites de ta table sont déjà dans un tableau.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  5. #5
    Membre averti
    Homme Profil pro
    Déveleoppeur Web/Mobile Fullstack
    Inscrit en
    avril 2013
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Déveleoppeur Web/Mobile Fullstack
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : avril 2013
    Messages : 273
    Points : 425
    Points
    425

    Par défaut

    Tu peux utiliser la fonction in_array sur le retour de la fonction array_column, pour ne rechercher la valeur que sur la colonne désirée. Ainsi tu peux rechercher ta valeur dans ton tableau multidimensionnel.

    Ça t'évite de faire une fonction récursive

  6. #6
    Modérateur
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    mars 2004
    Messages
    4 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : mars 2004
    Messages : 4 353
    Points : 10 750
    Points
    10 750

    Par défaut

    Salut,

    aucune chance d'y arriver avec la fonction in_array() par contre avec array_walk() c'est tout à fait faisable :
    dans le genre :
    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
    $data = [[
        'date'      => '2017-01-01',
        'valeur_id' => 32145,
        '0/1'       => '1'
    ], [
        'date'      => '2017-05-01',
        'valeur_id' => 41789,
        '0/1'       => '0'
    ], [
        'date'      => '2017-07-01',
        'valeur_id' => 87456,
        '0/1'       => '0'
    ]];
     
     
    $filter = [];
     
    array_walk($data, function($v, $k) use (&$filter)
    {
        if ($v['date'] === '2017-05-01') {
            $filter[] = $v;
        }
    });
     
    print_r($filter);
    Tu codes vraiment sur PHP 5.0 qui date de plus de 12 ans maintenant ?
    # Dans la Création, tout est permis mais tout n'est pas utile...

  7. #7
    Membre averti
    Homme Profil pro
    Déveleoppeur Web/Mobile Fullstack
    Inscrit en
    avril 2013
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Déveleoppeur Web/Mobile Fullstack
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : avril 2013
    Messages : 273
    Points : 425
    Points
    425

    Par défaut

    Biensûr que tu peux y arriver avec array_collumn mixé avec in_array

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     if (in_array($date, array_column($datearray, "date")) 
      {
        echo "class=\"cp\">cp";
      }
      else	
      {
        echo "class=\"travail\">";
      }

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    octobre 2006
    Messages
    674
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2006
    Messages : 674
    Points : 47
    Points
    47

    Par défaut

    Bonsoir,

    Je suis denouveau sur mon code, j'ai essayé ta méthode Sabotage, mais je bloque

    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
     
     
    $listedateperiodeconges = array();	
     
    while ( $listc = mysql_fetch_array( $query_conges ) ){
     
    $startperiodeconges = DateTime::createFromFormat('Y-m-d',$listc["debut_conges"]);
    $endperiodeconges = DateTime::createFromFormat('Y-m-d',$listc["fin_conges"]);
    $endperiodeconges = $endperiodeconges->add(new DateInterval('P1D'));
    $intervalperiodeconges = new DateInterval('P1D');
    //objet qui représente la période avec l'intervalle choisit
    $daterangeperiodeconges = new DatePeriod($startperiodeconges, $intervalperiodeconges ,$endperiodeconges);
     
    foreach($daterangeperiodeconges as $dateperiodeconges){
     
    	$listedateperiodeconges[$dateperiodeconges]=  array($listc["debut_conges"]);
        //echo'<th>', $date->format("d") ,'</th>';
    }
    }	
     
     
    $daterange2 = new DatePeriod($start, $interval ,$end);
    foreach($daterange2 as $data){
        echo '<td ';
     
    	if(isset($listedateperiodeconges($data))) 
    {
    ...
    ..
    J'ai essayé, mais sur ma page web j'ai une page banche (= erreur). Donc je dois avoir une erreur sur le code mais je ne vois pas mon erreur.
    J'ai modifié ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $listedateperiodeconges[$dateperiodeconges]=  array($listc["debut_conges"]);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if(isset($listedateperiodeconges($data)))

    Pourriez-vous m’éclairer sur mon erreur ?

    merci par avance

    guigui69

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    juillet 2005
    Messages
    28 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juillet 2005
    Messages : 28 562
    Points : 42 475
    Points
    42 475

    Par défaut

    Affiche les erreurs ou consulte tes logs.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  10. #10
    Modérateur
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    mars 2004
    Messages
    4 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : mars 2004
    Messages : 4 353
    Points : 10 750
    Points
    10 750

    Par défaut

    Comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (isset($listedateperiodeconges[$data]))
    Sincèrement $listedateperiodeconges c'est chaud à décoder, essaie d'aider quand même ceux qui lisent :
    $listeDatePeriodeConges ou encore $liste_date_periode_conges qui a ma préférence
    # Dans la Création, tout est permis mais tout n'est pas utile...

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    octobre 2006
    Messages
    674
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2006
    Messages : 674
    Points : 47
    Points
    47

    Par défaut

    Merci pour vos réponses, je regarde ca

    Est-ce que je peux rajouter un code dans ma page php pour visualiser les erreurs? ou bien c'est dans un fichier config qu'on regle cela ?

    guigui69

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    octobre 2006
    Messages
    674
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2006
    Messages : 674
    Points : 47
    Points
    47

    Par défaut

    Bonjour,

    J'ai testé ce matin

    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
     
     
    $listedateperiodeconges = array();	
     
    while ( $listc = mysql_fetch_array( $query_conges ) ){
     
    $startperiodeconges = DateTime::createFromFormat('Y-m-d',$listc["debut_conges"]);
    $endperiodeconges = DateTime::createFromFormat('Y-m-d',$listc["fin_conges"]);
    $endperiodeconges = $endperiodeconges->add(new DateInterval('P1D'));
    $intervalperiodeconges = new DateInterval('P1D');
    //objet qui représente la période avec l'intervalle choisit
    $daterangeperiodeconges = new DatePeriod($startperiodeconges, $intervalperiodeconges ,$endperiodeconges);
     
    foreach($daterangeperiodeconges as $dateperiodeconges){
    	//$listedateperiodeconges[]= $dateperiodeconges;
    	$listedateperiodeconges[$dateperiodeconges]= array($dateperiodeconges);
        //echo'<th>', $date->format("d") ,'</th>';
    }
    }	
     
     
    $daterange2 = new DatePeriod($start, $interval ,$end);
    foreach($daterange2 as $data){
        echo '<td ';
    	// if (in_array($data, $listedateperiodeconges)) 
    	if(isset($listedateperiodeconges[$data]))
    J'ai erreur sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: Illegal offset type in /var/www/rh/tableau_conges.php on line 102
    la ligne 102 c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $listedateperiodeconges[$dateperiodeconges]= array($dateperiodeconges);
    Je dois avoir loupé une étape mais je bloque on dirait qu'il veut pas de ma date dans le array(....)

    Merci d'avance pour vos conseils

    guigui69

  13. #13
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    juillet 2005
    Messages
    28 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juillet 2005
    Messages : 28 562
    Points : 42 475
    Points
    42 475

    Par défaut

    Tu ne peux pas mettre un objet Datetime en clef de tableau.
    Met ta date sous un format quelconque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $listedateperiodeconges[$dateperiodeconges->format('Ymd')]
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    octobre 2006
    Messages
    674
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2006
    Messages : 674
    Points : 47
    Points
    47

    Par défaut

    Merci Sabotage, c’était bien ca

    Cela affiche bien l'information, mais j'ai fonctionnement /bizarrerie que j'arrive pas à comprendre et à corriger.

    Mon code
    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
     
    $sql_conges="SELECT id_rhp, debut_conges, fin_conges,id_rhpcv FROM `rh_personnel_conges`
    WHERE `id_rhp`='".$list["id_rhp"]."'
    AND (month(`debut_conges`)='".$_POST["mois"]."' OR month(`fin_conges`)=".$_POST["mois"].")
    AND (year(`debut_conges`)='".$_POST["annee"]."' OR year(`fin_conges`)='".$_POST["annee"]."')
    and conges_annule='0'
    ORDER BY debut_conges";
    //echo '<br/>'.$sql_conges;
    $query_conges= mysql_query($sql_conges) or die('erreursql_conges');
    $nbconges=mysql_num_rows($query_conges);
    if ($nbconges == null)
    {
    for ($i = 1; $i <= $count; $i++) {
        echo '<td class="travail" >-</td>';
    }	
     
    }
    else
    {
     
    $listedateperiodeconges = array();	
     
    while ( $listc = mysql_fetch_array( $query_conges ) ){
    	echo '<br/>'.$listc["id_rhpcv"];
    	$id=$listc["id_rhpcv"];
    $startperiodeconges = DateTime::createFromFormat('Y-m-d',$listc["debut_conges"]);
    $endperiodeconges = DateTime::createFromFormat('Y-m-d',$listc["fin_conges"]);
    $endperiodeconges = $endperiodeconges->add(new DateInterval('P1D'));
    $intervalperiodeconges = new DateInterval('P1D');
    //objet qui représente la période avec l'intervalle choisit
    $daterangeperiodeconges = new DatePeriod($startperiodeconges, $intervalperiodeconges ,$endperiodeconges);
     
    foreach($daterangeperiodeconges as $dateperiodeconges)
    {
     
     
    	$listedateperiodeconges[$dateperiodeconges->format('d-m-Y')]= array("date" => $dateperiodeconges->format('Y-m-d'),"id" =>$id );
        //echo'<th>', $date->format("d") ,'</th>';
    	echo $id;
    }
    }	
     
     
    $daterange2 = new DatePeriod($start, $interval ,$end);
    foreach($daterange2 as $data){
        echo '<td ';
     
    	if(isset($listedateperiodeconges[$data->format("d-m-Y")])) 
    	{
     
    		if($listedateperiodeconges[$data->format("d-m-Y")]['id']=2) 
    		{
    ..
    .
    Resultat requete mysq:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    id_rhp debut_conges    fin_conges 	id_rhpcv
    107 	2017-08-28 	2017-09-03 	1
    107 	2017-09-11 	2017-09-17 	2
    107 	2017-09-18 	2017-09-24 	2
    donc la 1er ligne indique de date debut à date fin avec id='1'

    Quand je visualise avec "print_r($listedateperiodeconges);" j'ai ceci

    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
     
    Array
    (
        [28-08-2017] => Array
            (
                [date] => 2017-08-28
                [id] => 1
            )
     
        [29-08-2017] => Array
            (
                [date] => 2017-08-29
                [id] => 1
            )
     
        [30-08-2017] => Array
            (
                [date] => 2017-08-30
                [id] => 1
            )
     
        [31-08-2017] => Array
            (
                [date] => 2017-08-31
                [id] => 1
            )
     
        [01-09-2017] => Array
            (
                [date] => 2017-09-01
                [id] => 2
            )
     
        [02-09-2017] => Array
            (
                [date] => 2017-09-02
                [id] => 2
            )
     
        [03-09-2017] => Array
            (
                [date] => 2017-09-03
                [id] => 2
            )
     
        [11-09-2017] => Array
            (
                [date] => 2017-09-11
                [id] => 2
            )
     
        [12-09-2017] => Array
            (
                [date] => 2017-09-12
                [id] => 2
            )
     
    ...
    ..
    A partir du 2017-09-01 il lui indique ID N°2, pourquoi ???
    J'ai testé dans la page, cela m'affiche bien les 1
    voici le visu:
    Nom : erreurarrayid.png
Affichages : 22
Taille : 14,6 Ko

    Je comprend pas l'élément qui lui pose un problème. Pourquoi il me transforme ID en 2

    merci d'avance pour votre aide

    guigui69

  15. #15
    Membre éprouvé Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    septembre 2002
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : septembre 2002
    Messages : 765
    Points : 1 208
    Points
    1 208

    Par défaut

    Il manque un = dans un if.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(listedateperiodeconges[$data->format("d-m-Y")]['id']=2...
    Tu devrais penser à protéger ta requête SQL. En effet tu mets les variables POST telles quelles.
    De plus les fonctions mysql ne fonctionnent plus en php 7.

    Tes noms de variables tout en minuscules rendent ton code dur à lire.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    octobre 2006
    Messages
    674
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2006
    Messages : 674
    Points : 47
    Points
    47

    Par défaut

    Bonsoir,

    merci pour ta réponse tu penses que c'est le = qui pose un problème?

    car le $id est sur 2

    c'est a ce niveau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	$listedateperiodeconges[$dateperiodeconges->format('d-m-Y')]= array("date" => $dateperiodeconges->format('Y-m-d'),"id" =>$id );
    comment cette ID se met sur le 2 sur les premiere date/


    guigui69

  17. #17
    Membre éprouvé Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    septembre 2002
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : septembre 2002
    Messages : 765
    Points : 1 208
    Points
    1 208

    Par défaut

    Je ne sais pas si ça résout ton problème car :
    • il arrive souvent qu'un bug en masque un autre (tu solutionnes le premier mais ça ne fonctionne toujours pas parce que le second bug ne se voit que si le premier est résolu).
    • qu'il y ait plusieurs bugs sans lien entre eux.


    Mais ce qui est sûr c'est que dans un if on met == et non pas =.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    octobre 2006
    Messages
    674
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2006
    Messages : 674
    Points : 47
    Points
    47

    Par défaut

    Ben pas tu as raison le fait de rajouter un double egal a réglé le probleme plus haut c'est bizarre mais le plus important c'est que ca corrigé mon bug

    merci

    guigui69

Discussions similaires

  1. rechercher remplacer sur plusieurs colonnes
    Par deca2 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 23/05/2008, 12h57
  2. Recherche Valeur dans plusieurs colonnes
    Par grec38 dans le forum Excel
    Réponses: 14
    Dernier message: 08/04/2008, 15h37
  3. Recherche VBA dans plusieurs colonnes.
    Par madchemiker dans le forum VBA Access
    Réponses: 3
    Dernier message: 12/07/2007, 14h09
  4. [VBA-E] Recherche sur plusieurs colonnes ?
    Par Kokito dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 14/11/2006, 14h27
  5. Recherche dans plusieurs colonnes d'une table
    Par yoline dans le forum Access
    Réponses: 4
    Dernier message: 26/07/2006, 12h58

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