AccueilAccueil  FAQFAQ  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  Connexion  
Le Deal du moment :
Cdiscount : -30€ dès 300€ ...
Voir le deal

 

 explode / split - permet de découper un chaine en sous-segments

Aller en bas 
2 participants
AuteurMessage
Térence
Utilisateur confirmé: Rang *****
Térence


Messages : 2213
Localisation : Oui

explode / split - permet de découper un chaine en sous-segments Empty
MessageSujet: explode / split - permet de découper un chaine en sous-segments   explode / split - permet de découper un chaine en sous-segments EmptyMar 1 Avr 2014 - 20:56

Bonsoir,
Comme à chaque fois j'ai besoin de cette fonction avec GM et que je la retrouve jamais, bah je la poste ici  Yum! 

Version avec un séparateur de plusieurs caractères :

Code:
/*
    explode(str, sep, id);
   
    Coupe une chaîne en segments et retourne le segment id.
    Exemple : explode("Janvier||Février||Mars","||",2) retourne "Mars"
    
    str    la chaîne de départ
    sep    la séparateur
    id     l'index de la sous-chaine à retourner
*/
var str, sep, nb, idVal, lastVal, array;

str=argument0;
sep=argument1;

if(string_count(sep,str)==0){
    return str;
}

nb=string_count(sep, str);
for(i=0;i<nb;i+=1){
    array[i]="";
}

idVal=0;
lastVal="";
for(i=0;i<=string_length(str);i+=1){
    if(string_copy(str,i,string_length(sep))==sep){
        array[idVal]=lastVal;
        idVal+=1;
        lastVal="";
        i+=string_length(sep)-1;
    }else{
        lastVal+=string_char_at(str,i);
    }
}
array[idVal]=lastVal;
return array[argument2];

Version optimisée si le séparateur n'est que d'un seul caractère :
Code:

/*
    explode(str, sep, id);
   
    Coupe une chaîne en segments et retourne le segment id.
    Exemple : explode("Janvier||Février||Mars","||",2) retourne "Mars"
    
    str    la chaîne de départ
    sep    la séparateur
    id     l'index de la sous-chaine à retourner
*/
var str, sep, nb, idVal, lastVal, array;

str=argument0;
sep=argument1;

if(string_count(sep,str)==0){
    return str;
}

nb=string_count(sep, str);
for(i=0;i<nb;i+=1){
    array[i]="";
}

idVal=0;
lastVal="";
for(i=0;i<=string_length(str);i+=1){
    if(string_char_at(str,i)==sep){
        array[idVal]=lastVal;
        idVal+=1;
        lastVal="";
    }else{
        lastVal+=string_char_at(str,i);
    }
}
array[idVal]=lastVal;
return array[argument2];

En gros c'est la fonction explode en PHP, à quelques différences près. Puisqu'on peut pas retourner un tableau, bah faut spécifier l'index de la sous chaine à récupérer...
Exemple :
explode("Bonjour*/*Salut*/*Coucou","*/*",1) retourne "Salut".

Bon, c'est pas du tout optimisé, mais franchement j'ai la flemme, et je suis partie du principe que je pourrais renvoyer un tableau...

3ème version, on peut pas retourner de tableau, mais on peut utiliser une variable globale \o/ Alors certes c'est pas optimisé, mais ca l'est quand même beaucoup plus que de tout recalculer quand on veut faire une boucle par exemple.

Code:

/*
    explode(str, sep, id);
   
    Coupe une chaîne en segments et les retourne sous forme dans le tableau global.Explode[].
    Exemple : explode("Janvier||Février||Mars","||",2) retourne "Mars"
   
    str    la chaîne de départ
    sep    la séparateur
*/
var i, str, sep, nb, idVal, lastVal;

str=argument0;
sep=argument1;

nb=string_count(sep, str);
if(nb==0){
    global.Explode[0]=str;
    return 0;
}

for(i=0;i<nb;i+=1){
    global.Explode[i]="";
}

idVal=0;
lastVal="";
for(i=1;i<=string_length(str);i+=1){
    if(string_copy(str,i,string_length(sep))==sep){
        global.Explode[idVal]=lastVal;
        idVal+=1;
        lastVal="";
        i+=string_length(sep)-1;
    }else{
        lastVal+=string_char_at(str,i);
    }
}
global.Explode[idVal]=lastVal;

Pas besoin de spécifier l'index maintenant, on récupère tout dans le tableau global.Explode[].

_________________
Je suis partie sur les ailes du vent et la tempête m'a ramenée.


Dernière édition par Térence68 le Ven 4 Avr 2014 - 20:03, édité 4 fois
Revenir en haut Aller en bas
onilink_
Modérateur
onilink_


Messages : 9180
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

explode / split - permet de découper un chaine en sous-segments Empty
MessageSujet: Re: explode / split - permet de découper un chaine en sous-segments   explode / split - permet de découper un chaine en sous-segments EmptyMar 1 Avr 2014 - 21:03

Héhé, ou split pour les intimes :p

_________________
explode / split - permet de découper un chaine en sous-segments Runningpotato1explode / split - permet de découper un chaine en sous-segments TvF6GED explode / split - permet de découper un chaine en sous-segments MdetltS
Revenir en haut Aller en bas
Térence
Utilisateur confirmé: Rang *****
Térence


Messages : 2213
Localisation : Oui

explode / split - permet de découper un chaine en sous-segments Empty
MessageSujet: Re: explode / split - permet de découper un chaine en sous-segments   explode / split - permet de découper un chaine en sous-segments EmptyJeu 3 Avr 2014 - 18:42

Effectivement, je l'avais mis dans le titre pour qu'on puisse facilement le trouver en faisant une recherche.
Sinon c'est juste pour signaler que j'ai modifié le code : j'ai résolu un bug qui empêchait de récupérer le dernier index du tableau, et si la chaine ne contient pas du tout le séparateur, il retourne la chaîne entière.

_________________
Je suis partie sur les ailes du vent et la tempête m'a ramenée.
Revenir en haut Aller en bas
onilink_
Modérateur
onilink_


Messages : 9180
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

explode / split - permet de découper un chaine en sous-segments Empty
MessageSujet: Re: explode / split - permet de découper un chaine en sous-segments   explode / split - permet de découper un chaine en sous-segments EmptyJeu 3 Avr 2014 - 19:13

Ce serait peut être cool aussi d'avoir une version ou le séparateur fait un seul char non? Car avec ces string_copy a tout va je suis presque certain que pour un gros tableau, ça doit être un peu mou :b
Fin y a juste a ajouter un if + une copie modifiée de la loop dans ton code et y a moyen d'avoir une bonne opti je pense.

_________________
explode / split - permet de découper un chaine en sous-segments Runningpotato1explode / split - permet de découper un chaine en sous-segments TvF6GED explode / split - permet de découper un chaine en sous-segments MdetltS
Revenir en haut Aller en bas
Térence
Utilisateur confirmé: Rang *****
Térence


Messages : 2213
Localisation : Oui

explode / split - permet de découper un chaine en sous-segments Empty
MessageSujet: Re: explode / split - permet de découper un chaine en sous-segments   explode / split - permet de découper un chaine en sous-segments EmptyJeu 3 Avr 2014 - 19:22

C'est fait, par contre vu que GM est incapable d'arrêter un if quand la condition n'est de toute façon pas vérifié et que je suis une feignasse, j'ai pas 'fusionnées' les deux fonctions ^^'

_________________
Je suis partie sur les ailes du vent et la tempête m'a ramenée.
Revenir en haut Aller en bas
Contenu sponsorisé





explode / split - permet de découper un chaine en sous-segments Empty
MessageSujet: Re: explode / split - permet de découper un chaine en sous-segments   explode / split - permet de découper un chaine en sous-segments Empty

Revenir en haut Aller en bas
 
explode / split - permet de découper un chaine en sous-segments
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Découper les images qui en font 1 seule
» Decouper un polygone a partir d'une image
» Limite chaine de caractère
» supprimer la fin d'une chaine :question:
» test chaine de caractère

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Forum Le CBNA :: Développement :: Scripts GML-
Sauter vers: