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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de spawns
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    558
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 558
    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 confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    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 éclairé Avatar de spawns
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    558
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 558
    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 confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    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

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

  6. #6
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    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

+ 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