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 :

Fonction in_array d'un array contenant d'autres array


Sujet :

Langage PHP

  1. #1
    Membre habitué Avatar de spawns
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    558
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 558
    Points : 193
    Points
    193
    Par défaut Fonction in_array d'un array contenant d'autres array
    Salut a tous,
    j'aurais besoin de vérifier si une valeur se trouve bien dans un tableau lui même se trouvant dans un tableau
    mon tableau avec mes tableaux a l’intérieur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $bob[]=array($surl,$sicon,$snom,$sidmenu);
    la vérification qui ne fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(in_array($id,$bob[])){.....}
    comment faire pour que la vérification se fasse sur tous les tableau contenu dans le tableau bob

    Merci d'avance de votre aide et de vos explications.

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    salut,

    2 options :
    - fonction récursive qui fait appel à in_array() sur chaque niveau
    - array_walk_recursive() qui mène au même résultat en plus simplement (gère nativement la récursivité...)

  3. #3
    Membre habitué Avatar de spawns
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    558
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 558
    Points : 193
    Points
    193
    Par défaut
    Merci pour les infos,
    mais je ne vois pas comment intégrer cela a mon code, je suis pas un as de la prog .
    j'ai essayer de tester avec l’exemple donner dans la fonction sur mon array bob[] mais il me dit qu'il manque les argument 3 et 4
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function test_print($surl, $sicon, $snom,$sidmenu)
    {
        echo "url : $surl et icon : $sicon et nom : $snom et idmenu : $sidmenu<br />";
    }
    array_walk_recursive($bob, 'test_print');
    au final je veux juste savoir si la variable $idmenu exist dans les sous-tableaux

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Je voyais quelque chose comme ça :
    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
    <?php
     
    $surl    = 'http://...';
    $sicon   = 'abc';
    $snom    = '123';
    $sidmenu = 'm123';
    $bob     = [[$surl, $sicon, $snom, $sidmenu]];
     
    function in_array_recursive($needle, array $haystack, $strict = false)
    {
        $in_array = false;
     
        array_walk_recursive($haystack,
            function($v, $k) use ($needle, $strict, &$in_array)
            {
                if (($strict && ($v === $needle)) || (( ! $strict) && ($v == $needle)))
                {
                    $in_array = true;
                }
            });
     
        return $in_array;
    }
     
    $test = in_array_recursive(123, $bob, false);
     
    ?>

  5. #5
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    J'ai fait la fonction récursive :

    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
    $array = array(
        'a',
        'b',
        array('d', 'e', array('j', 'k')),
        'l',
        array('m', 'n', 'e')
    );
     
    function in_array_recursive($valSearch, $array) {
        if (is_array($array)) {
            if (in_array($valSearch, $array)) {
                return true;
            }
            foreach ($array as $val) {
                if (in_array_recursive($valSearch, $val)) {
                    return true;
                }
            }
        }
        return false;
    }
     
    $res = in_array_recursive('m', $array);
    var_dump($res);
    J'ai essayé de faire la manière avec array_walk_recursive, et pour tout dire j'y suis pas arrivé ne connaissant pas la syntaxe avec "use" (c'est là que je bloquais, je voyais pas comment renvoyer le résultat)

    Après, je sais pas si c'est mieux en terme de performance étant donné qu'on continue de parcourir le tableau même si on a déjà trouvé, mais d'un autre côté y a pas d'appel à d'autres fonctions..
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par Spartacusply Voir le message
    Après, je sais pas si c'est mieux en terme de performance étant donné qu'on continue de parcourir le tableau même si on a déjà trouvé, mais d'un autre côté y a pas d'appel à d'autres fonctions..
    A la base, la fonction native array_walk_recursive() est optimisée, donc en terme de performance même si l'itération continue une fois le résultat trouvé, cela ne devrait pas être gênant.
    Après il y a bien une méthode crade pour couper le sifflet aux fonctions du style array_walk et consorts, c'est de carrément tirer une exception : throw \Exception(); une fois le résultat atteint et de traiter la réponse en dehors de la fonction, mais bon c'est vraiment très très moche et à ne pas faire sauf si la vie de belle-maman en dépend

  7. #7
    Membre habitué Avatar de spawns
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    558
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 558
    Points : 193
    Points
    193
    Par défaut
    re,
    j'ai essayé vos deux technique mais cela ne fonctionne pas avec mon array.
    pour donner + d'info il s'agit d'un menu avec un sous-menu.

    le but étant de savoir si le menu a des sous-menu et si oui, afficher une icone.
    a savoir en bdd $idmenu de la table sous-menu est = a l'id de la table menu

    je vous met + de 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
     
    $result=mysql_query("SELECT count(*) as total FROM sousmenu GROUP BY idmenu");
    $lenbr="";
    while($data2=mysql_fetch_assoc($result)){
    $lenbr.=$data2['total'];
    }			
    // ----------Array sousmenu --------------
    $req1 = mysql_query("SELECT * FROM sousmenu ORDER BY position, idmenu ASC ") or die("Erreur SQL !");
    while($data1 = mysql_fetch_array($req1)){
    	$sidmenu=$data1['idmenu'];
    	$snom=$data1['nom'];
    	$surl=$data1['url'];
    	$sicon=$data1['icon'];
    	$bob[]=array($surl,$sicon,$snom,$sidmenu);
    	}
    // ----------Array sousmenu Fin--------------
     
    			$req = mysql_query("SELECT * FROM menu ORDER BY position ASC ") or die("Erreur SQL !"); 
    			 while($data = mysql_fetch_array($req)) 
    			{
    			$id=$data['id'];
    			$nom=$data['nom'];
    			$url=$data['url'];		
    			$icon=$data['icon'];				
    			echo '<li';
    					if ($nav_en_cours == $nom) 
    					{
    					echo ' id="en-cours"';
    					}
     
    					$licone='<span class="icon-fleche-bas"> </span>';
     
    					echo '><a href="'.$url.'">'.$icon.' '.$nom.' '.$licone.' </a>';
     
    				 echo "<ul>";
    						foreach($bob AS $v)
    						{
    							if ($v[3]==$id)
    							{
    								echo '<li><a href="'.$v[0].'">'.$v[1].' '.$v[2].'</a></li>';
    							}							
    						}
    						echo "</ul>";			
     
    			echo '</li>';
    			}
    Merci

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    J'ai du mal avec ton code, d'ailleurs je ne vois pas du tout l'utilité de in_array_recursive().
    Pourquoi ne ramènes-tu pas ton menu en intégralité en une seule requête du style :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT m.*, sm.* FROM menu m LEFT JOIN sousmenu sm ON m.id = sm.idmenu ORDER BY m.position, sm.position

  9. #9
    Membre habitué Avatar de spawns
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    558
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 558
    Points : 193
    Points
    193
    Par défaut
    re,
    la requête ne renvoie aucun résultat au niveau menu déja j'ai pas essayé le sous menu ???
    mes tables sont sous cette forme :
    Menu
    id | nom | url | icon | position

    sous menu
    id | nom | url | icon | position | idmenu

    idmenu est joint à id table menu

    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
     
    			$req = mysql_query("SELECT m.*, sm.* FROM menu m LEFT JOIN sousmenu sm ON m.id = sm.idmenu ORDER BY m.position, sm.position") or die("Erreur SQL !");
    			 while($data = mysql_fetch_array($req)) 
    			{
     
    			$mid=$data['m.id'];
    			$mnom=$data['m.nom'];
    			$murl=$data['m.url'];		
    			$micon=$data['m.icon'];	
     
    			echo '<li';
    					if ($nav_en_cours == $mnom) 
    					{
    					echo ' id="en-cours"';
    					}
    				//$licone='<span class="icon-fleche-bas"> </span>';
     
    					echo '><a href="'.$murl.'">'.$micon.' '.$mnom.' </a>';
     
    				/* echo "<ul>";
    						foreach($bob AS $v)
    						{
    							if ($v[3]==$id)
    							{
    								echo '<li><a href="'.$v[0].'">'.$v[1].' '.$v[2].'</a></li>';
    							}							
    						}
    						echo "</ul>";*/	
     
    			echo '</li>';	
    			}
    Une idée ???

  10. #10
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Si tu exécutes la requête directement à la main, tu ne récupères rien ?
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT m.*, sm.* FROM menu m LEFT JOIN sousmenu sm ON sm.idmenu = m.id ORDER BY m.position, sm.position

  11. #11
    Membre habitué Avatar de spawns
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    558
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 558
    Points : 193
    Points
    193
    Par défaut
    ben j'avais pas essayé, mais si, ça marche,
    c'est quoi ce bazar.
    il est ou le blem dans mon code ????

  12. #12
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    J'en sais rien pourquoi chez toi ça ne marche pas ^^

    Mais bon, mes capacités de voyant se limitant à mon écran/clavier , je te conseille de reprendre le code et de remonter ton menu intégralement à partir de cette requête unique.
    Quand tu liras les données, pense juste à chaque changement de la valeur menu, à gérer proprement tes <ul>...</ul>

  13. #13
    Membre habitué Avatar de spawns
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    558
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 558
    Points : 193
    Points
    193
    Par défaut
    si regarde j'avais mis le code avec ta requête 2 posts au dessus

    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
     
    $req = mysql_query("SELECT m.*, sm.* FROM menu m LEFT JOIN sousmenu sm ON m.id = sm.idmenu ORDER BY m.position, sm.position") or die("Erreur SQL !");
    			 while($data = mysql_fetch_array($req)) 
    			{
     
    			$mid=$data['m.id'];
    			$mnom=$data['m.nom'];
    			$murl=$data['m.url'];		
    			$micon=$data['m.icon'];	
     
    			echo '<li';
    					if ($nav_en_cours == $mnom) 
    					{
    					echo ' id="en-cours"';
    					}
    				//$licone='<span class="icon-fleche-bas"> </span>';
     
    					echo '><a href="'.$murl.'">'.$micon.' '.$mnom.' </a>';
     
    				/* echo "<ul>";
    						foreach($bob AS $v)
    						{
    							if ($v[3]==$id)
    							{
    								echo '<li><a href="'.$v[0].'">'.$v[1].' '.$v[2].'</a></li>';
    							}							
    						}
    						echo "</ul>";*/	
     
    			echo '</li>';	
    			}

  14. #14
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    J'avais bien vu ton bout de code... il est sans erreur apparente, maintenant savoir pourquoi chez toi ça ne produit rien, c'est une autre histoire.

  15. #15
    Membre habitué Avatar de spawns
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    558
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 558
    Points : 193
    Points
    193
    Par défaut
    A Ok,
    parce que effectivement il ne m'affiche pas d'erreur SQL,
    peut dans le while la façon de sortir les résultats mais je ne vois pas ou ???

    il n'y a pas une façon particulière de ressortir les résultats sur ce type de requête ?

    je vais poster le problème dans le forum approprié.

    Merci de ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/12/2013, 21h00
  2. Array + fonction + variable passée en paramètre contenant le nom d'un array
    Par MelkInarian dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/10/2011, 11h35
  3. Numpy : copier un array dans un autre array
    Par jlg_47 dans le forum Calcul scientifique
    Réponses: 3
    Dernier message: 24/03/2010, 10h23
  4. Récupération d'un array dans un autre array
    Par slake13 dans le forum Langage
    Réponses: 1
    Dernier message: 14/10/2009, 16h09
  5. Réponses: 21
    Dernier message: 20/06/2006, 16h49

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