Partage
  • Partager sur Facebook
  • Partager sur Twitter

Segmenter un tableau en sous tableaux

    15 septembre 2017 à 11:08:38

    Bonjour,

    Je rencontre un problème que je n'arrive pas à résoudre dans la manipulation de plusieurs tableaux, je m'explique.

    Je récupère une url sur laquelle j'effectue un explode afin de la segmenter en différents tableaux qui correspondent chacun à une action particulière effectuée.

    Dans mon URL je peux récupérer 4 types d'action différentes que j'ai bien réussi à distinguées.

    Mon problème intervient dans la deuxième étape, je dois désormais regrouper un type d'action 2 dans un type d'action 1 selon un paramètre identique dans l'url mais je

    n'arrive pas à identifier ce paramètre j'ai d'abord penser a effectuer une recherche dans la chaine de caractère pour identifier ce paramètre mais je n'y arrive pas je

    cherche maintenant à faire un explode sur chaque élément du tableau pour le récupérer plus facilement mais je n'y arrive toujours pas donc je demande votre aide :)

    Voici un exemple :

    //Récupération de l'URL et affichage sur le navigateur
    $result = curl_exec($ch);
    
    // Data récupérées mais non affichées par le navigateur, nous procédons désormais
    // à la mise en page des éléments.
    
    $urlArray = explode(",",$result); // explode coupe une chaine en segment
    $urlArray= array_splice($urlArray, 2); // array_splice efface et remplace une portion du tableau ici on efface les deux premier éléments
    
    //****** Tableau et regex /a/render ******//
    $tabRender = array(); 
    $rRender = '/\/a\/render\//'; 
    //****************************************//
    
    //****** Tableau et regex /a/adjs2 *******//
    $tabAdjs2 = array(); 
    $rAdjs2 = '/\/a\/adjs2/'; 
    //****************************************//
    
    // On boucle sur $urlArray pour séparer nos différents cas
    // On les sépare ensuite dans différents tableaux
    for($i = 0; $i < count($urlArray); $i++) {
       
        $str = $urlArray[$i];
        if (preg_match_all($rZone, $str, $matches, PREG_SET_ORDER, 0)) {   
            array_push($tabZone, $urlArray[$i]);   
        } else if (preg_match_all($rRender, $str, $matches, PREG_SET_ORDER, 0)){
            array_push($tabRender, $urlArray[$i]);   
        } else if (preg_match_all($rAdjs2, $str, $matches, PREG_SET_ORDER, 0)){
            array_push($tabAdjs2, $urlArray[$i]);    
        } else if (preg_match_all($rView, $str, $matches, PREG_SET_ORDER, 0)){
            array_push($tabView, $urlArray[$i]);    
        } else if (preg_match_all($rLog, $str, $matches, PREG_SET_ORDER, 0)){
            array_push($tabLog, $urlArray[$i]);    
        } else {
            echo 'ERREUR le cas de : '.$urlArray[$i].' n\'a pas été pris en compte';
        }
    }
    
    for($i = 0; $i < count($tabRender); $i++) {
        $str = $tabRender[$i];
        //if (preg_match_all('#excludePartner=#', $str, $matches, PREG_SET_ORDER, 0)) { 
            $tabRenderSorted[] = Array(
                'url' => $tabRender[$i],
                'length' => strlen($tabRender[$i]),
            );
            array_push($tabRenderSorted['url'], $tabRender[$i]);
            array_push($tabRenderSorted['length'], strlen($tabRender[$i]));
    
    }
    
    foreach ($tabRenderSorted as $key => $row) {
        $url[$key]  = $row['url'];
        $length[$key] = $row['length'];
    }
    
    array_multisort($length, SORT_ASC, $tabRenderSorted);
    
    //***************************** On tris ensuite les /a/adjs2 ****************************** 
    for($i = 0; $i < count($tabAdjs2); $i++) {
        $str = $tabAdjs2[$i];
        //if (preg_match_all('#excludePartner=#', $str, $matches, PREG_SET_ORDER, 0)) { 
            $tabAdjs2Sorted[] = Array(
                'url' => $tabAdjs2[$i],
                'length' => strlen($tabAdjs2[$i]),
            );
            array_push($tabAdjs2Sorted['url'], $tabAdjs2[$i]);
            array_push($tabAdjs2Sorted['length'], strlen($tabAdjs2[$i]));     
    }
    
    foreach ($tabAdjs2Sorted as $key => $row) {
        $url[$key]  = $row['url'];
        $length[$key] = $row['length'];
    }
    
    array_multisort($length, SORT_ASC, $tabAdjs2Sorted);
    
    
    
    print_r($tabRenderSorted);
    print_r($tabAdjs2Sorted);
    
    




    • Partager sur Facebook
    • Partager sur Twitter
      17 septembre 2017 à 12:26:10

      Hello itachizanagi,

      Je suis désolé, je n'ai pas assez d'éléments pour t'aider. Est-ce que tu peux donner des scéarios de données qui arrivent et comment elles sont traitées par ton script? D'ailleurs ce precessus est très utile pour repérer des bugs.

      Une autre solution peut-être de var_dump partout et tu devrais localiser à quel moment ça foire.

      Bonne chance

      Cordialement

      the Lebanese

      • Partager sur Facebook
      • Partager sur Twitter
        18 septembre 2017 à 8:53:23

        Salut the Lebanese,

        Merci de prendre la peine de m'aider c'est super gentil :).

        J'ai un peu modifier mon code le voici :

        function multi_explode($delimiters = array(), $string = '')
        	{
        		$result = array();
        		
        		foreach ($delimiters as $delimiter)
        			if (!isset($array))	
        				$array = explode($delimiter, $string);
        			else
        				foreach ($array as $key => $string)	
        					$result[] = explode($delimiter, $string);
        		
        		return $result;
        	}
        $delimiters = array(',', '&');
        
        $urlArray = multi_explode($delimiters, $result);
        $urlArray = array_splice($urlArray, 2); // On supprime les deux premier tableaux car useless
        
        
        //****** Tableau et regex /log/zone ******//
        $tabZone = array(); 
        $rZone = '/\/log\/zone\//'; 
        //****************************************//
        
        //****** Tableau et regex /a/render ******//
        $tabRender = array(); 
        $rRender = '/\/a\/render\//'; 
        //****************************************//
        
        //****** Tableau et regex /a/adjs2 *******//
        $tabAdjs2 = array(); 
        $rAdjs2 = '/\/a\/adjs2/'; 
        //****************************************//
        
        //***** Tableau et regex /a/log/view *****//
        $tabView = array(); 
        $rView = '/\/a\/log\/view/'; 
        //****************************************//
        
        //******* Tableau et regex /log/ *********//
        $tabLog = array(); 
        $rLog= '/\/log\//'; 
        //****************************************//
        
        foreach($urlArray as $i => $sous_tableau)
        {
            //echo 'Dossier : '.$sous_tableau[0].'. *** .';
            //echo 'Partner : '.$sous_tableau[18]. '. --- .'; 
            $file = $sous_tableau[0];
            $exclude = $sous_tableau[18];
            if (preg_match_all($rRender, $file, $matches, PREG_SET_ORDER, 0)){
                array_push($tabRender, $urlArray[$i]); 
                
            }
            if (preg_match_all($rAdjs2, $file, $matches, PREG_SET_ORDER, 0)){
                if($exclude == $tabRender[$i]) {
                    array_push($tabRender, $urlArray[$i]); 
                } else {
                    array_push($tabAdjs2, $urlArray[$i]);
                }
                
                
            }
            if($tabRender[$i] != NULL)
                var_dump($tabRender[$i]);
        }

        Et voici ce que le var_dump() donne :

        array(18) { [0]=> string(21) ""/a/render/?width=728" [1]=> string(9) "height=90" [2]=> string(13) "special=11111" [3]=> string(11) "has_flash=1" [4]=> string(17) "alea=0l6zeolzv97k" [5]=> string(9) "visible=0" [6]=> string(24) "domain=xxxxxxx.com" [7]=> string(21) "r=0.xxxxxxx" [8]=> string(16) "bla=" [9]=> string(22) "bla=" [10]=> string(18) "bla=" [11]=> string(6) "nav=ch" [12]=> string(21) "version=60.0.3112.113" [13]=> string(6) "os=win" [14]=> string(8) "ssp=node" [15]=> string(15) "bla" [16]=> string(46) "impid=12" [17]=> string(10) "zone=71123" [18]=> string(56) "valeurde=46790%2C46072" "2017-09-15T06:42:23.320Z"" }

        array(19) { [0]=> string(21) ""/a/blabla/?width=728" [1]=> string(9) "height=90" [2]=> string(13) "special=11111" [3]=> string(11) "has_flash=1" [4]=> string(17) "alea=0l6zeolzv97k" [5]=> string(9) "visible=0" [6]=> string(24) "domain=xxxxxxx.com" [7]=> string(21) "r=0.xxxxxxx" [8]=> string(16) "bla=" [9]=> string(22) "bla=" [10]=> string(18) "bla=" [11]=> string(6) "nav=ch" [12]=> string(21) "version=60.0.3112.113" [13]=> string(6) "os=win" [14]=> string(8) "ssp=node" [15]=> string(15) "bla" [16]=> string(46) "impid=12" [17]=> string(10) "zone=71123" [18]=> string(56) "valeurde=46790%2C46072" "2017-09-15T06:42:23.320Z"" }

        Je dois dans un premier temps checké l'élément [0] de chaque tableau et voir s'il s'agit d'un render" ou d'un "blabla".
        Ensuite je regarde l'indice [19] et je dois checké le numéro après le "valeurde=" car celui-ci peut avoir différentes longueur.
        Une fois cette longueur récupérer je dois voir pour chaque "render" tous les "blabla" qui ont le même "valeurde=" et mettre tous les blabla dans le render en question.
        Je ne sais pas si c'est plus clair de la sorte...



        -
        Edité par itachizanagi 18 septembre 2017 à 8:55:29

        • Partager sur Facebook
        • Partager sur Twitter
          18 septembre 2017 à 9:18:12

          Salut itachizanagi,

          Je crois que je comprends un peu mieux. Tu as une collection d'url et tu veux associer ceux qui ont le même valeurde code.

          Ce qui complique beaucoup les choses, c'est une approche qu'avec des tableaux d'une part. L'utilité d'objects se fait bien sentir là. Mais si tu ne connais pas on peut essayer autre chose.

          • Crée un tableau de renders. Boucle à travers ta collection et si c'est un render crée un render[code] = array()
          • Après boucle à travers ta collection encore une fois. Regarde si c'est un blabla, et si c'en est un vérifie le code, si c'est le même ajoute le au render[code] tableau

          A la fin tu te retrouvera avec un tableau de render avec pour chaque code, un tableau des urls de blabla.

          Bonne chance

          the Lebanese

          • Partager sur Facebook
          • Partager sur Twitter
            18 septembre 2017 à 14:58:33

            Merci beaucoup je vais essayer ça demain matin car le serveur a planter :(

            Je te fais un retour dès que possible en tout cas je te remercie pour cette piste et pour info je suis en train d'apprendre la POO donc s'il y a une solution de ce côté cela m'intéresse car ca me permettra de m'exercer.

            Bonne journée à toi.

            • Partager sur Facebook
            • Partager sur Twitter
              19 septembre 2017 à 16:39:45

              Salut the Lebanese,

              Après de nombreux essais je n'arrive pas à faire ce que tu m'as conseillé peux-tu me donner un exemple stp ?

              Merci encore.

              • Partager sur Facebook
              • Partager sur Twitter

              Segmenter un tableau en sous tableaux

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown