Febrero 29, 2016, 12:28:30 AM Ultima modificación: Septiembre 09, 2017, 06:10:36 PM por NiuWeb
Autor: NiuWeb
Versión de GM utilizada: Studio 1.4.1657
Descripción: Separa una cadena en un array, tomando como separador la subcadena dada. Por ejemplo, si se separa "hola-que-hace" con el signo "-", devolverá un array con las cadenas "hola", "que" y "hace"
Código:
[gml]
///split(string, separator);
var str = argument0 + argument1;
var sep = argument1;
var sln = string_length(str);
var pln = string_length(sep);

if(sep == "") return false;

var arr, ind = 0;

var i = 1;
while(string_pos(sep, str))
{
    check = string_copy(str, i, pln);
    if(check == sep)
    {
        arr[ind++] = string_copy(str, 1, i - 1);
        str = string_delete(str, 1, i + pln - 1);
        i = 1;
        continue;
    }   
    i++
}
return arr;
[/gml]

Nota: El separador puede ser tanto de uno como de varios caracteres

Argumentos:
str: La cadena a dividir
sep: El separador para dividir.

EDIT: Código optimizado.
alaberga regué el café.

BA:STFW&RTFM

¿El codigo que lo pongo en el apartado de Scripts?
¿Y como me refiero a cada posicion del array?
¿Con arr[0], arr[1], arr[2]...?

#2 Febrero 29, 2016, 01:00:38 AM Ultima modificación: Febrero 29, 2016, 01:09:29 AM por NiuWeb
Sí, el código lo pones en el apartado de Scripts. Más información, el manual xD
Para obtener lo que recibes, primero debes almacenar el resultado en alguna variable, puesto que el script usa variables locales a él que se borran al finalizarse, aunque antes de eliminarlas las devuelve, claro xD. Algo así:
[gml]
las_divisiones = explode("hola:como:te:va", ":");
[/gml]

Y para referirte a cada dato, debes referirte así:
[gml]
show_message(las_divisiones[0]); //Muestra "hola"
show_message(las_divisiones[1]); //Muestra "como"
//...etc
[/gml]

También puedes apoyarte de la función  array_length_1d, manual aquí
alaberga regué el café.

BA:STFW&RTFM

Tengo lo siguiente:

DRAW
rec_online = explode(result,"|x|");


draw_text(180,650,rec_online[0]);
draw_text(280,650,rec_online[1]);
draw_text(380,650,rec_online[2]);


Pero me salta este error:
ERROR!!! :: ############################################################################################
FATAL ERROR in
action number 1
of Draw Event
for object obj_version:


Push :: Execution Error - Variable Index [0,1] out of range [1,1] - -1.rec_online(100028,1)
at gml_Object_obj_version_DrawEvent_1 (line 46) - draw_text(280,650,rec_online[0]);

El error es que estás intentando acceder a un índice inexistente del array
Muestra la cadena que el explode recibe, porque si tienes algo como "perro|x|gato" es obvio que soltará un error, puesto que devolverá un array con sólo dos índices (del 0 al 1) que contienen "perro" y "gato", y por lo tanto el índice 2 no existe
alaberga regué el café.

BA:STFW&RTFM

#5 Febrero 29, 2016, 01:31:31 AM Ultima modificación: Febrero 29, 2016, 01:34:32 AM por djboro88
La cadena muestra esto:
Perro|x|Gato|x|Leon|x|

Si escrito la cadena como tal, a mano si que funciona, pero si le indico la variable "result", me salta el error.

#6 Febrero 29, 2016, 01:37:57 AM Ultima modificación: Febrero 29, 2016, 01:40:56 AM por NiuWeb
Pues ni idea de por qué no te sirve, algo estarás haciendo mal. Lo probé en un proyecto totalmente en blanco, copié el script, lo pequé, creé un objeto vacío y en su evento Draw puse exactamente esto:
[gml]
rec_online = explode("Perro|x|Gato|x|Leon|x|","|x|");

draw_text(180,650,rec_online[0]);
draw_text(280,650,rec_online[1]);
draw_text(380,650,rec_online[2]);

[/gml]
Ni el más mínimo error


EDITTTT xD No ví la edición en tu mensaje xD... ¿No crees que si manualmente funciona, el error está es en la cadena almacenada en la variable result? Intenta usar un show_message() antes de hacer el explode para comprobar
alaberga regué el café.

BA:STFW&RTFM

Si si, así si que funciona, pero con la variable "result" donde se guarda el resultado de la consulta de la BD.
No funciona.

Entonces el error no es de mi script, es de tu string XD
Revísa la cadena de la variable result antes de hacer el explode, haz un show_message() y corrobora que esté bien
alaberga regué el café.

BA:STFW&RTFM

Ya se cual es el problema.

Se inicializa la variable result con
result = "";

Entonces el primer mensaje muestra " " (vacio).
Y ya el siguiente muestra la cadena.

Pero si tengo que inicializar la variable result, ¿como la inicializo, le cambio el valor y muestro la cadena?

No preguntes eso por aquí, tu problema no tiene absolutamente nada que ver con el script. Pero weno... Sólo haces una condición:
[gml]
if result != ""
{
rec_online = explode(result,"|x|");
draw_text(180,650,rec_online[0]);
draw_text(280,650,rec_online[1]);
draw_text(380,650,rec_online[2]);
}
[/gml]
Lo que ejecutará el código sólo si la variable result no está vacía
alaberga regué el café.

BA:STFW&RTFM

Porfin !!!  1000 GRACIAS  ;D ;D

Solo un apunte en cuanto al signo de distinto...
if result <> ""
{
rec_online = explode(result,"|x|");
draw_text(180,650,rec_online[0]);
draw_text(280,650,rec_online[1]);
draw_text(380,650,rec_online[2]);
}

He reescrito el script, ahora es un poco más corto y eficiente, aunque sigue funcionando exactamente igual :D
alaberga regué el café.

BA:STFW&RTFM