PHP - Problemas con arrays

   
Vista:
Imágen de perfil de Miguel

Problemas con arrays

Publicado por Miguel macsistemasar@yahoo.com.ar (4 intervenciones) el 01/08/2016 21:26:26
Hola, necesito una mano con la siguiente cuestion:
reemplazar los caracteres de una variable y devolver el resultado en una nueva variable, se me ocurrió hacerlo mediante un array, pero si hubiera otra forma, bienvenida sea...
-------------------------------------------------------------------------------------------------------------------
Problema 1:
$palabra='ABRACADABRA'; //variable que contiene una palabre de x longitud de caracteres
$largo = strlen($palabra); //saco la longitud = 11
$arr_palabra = str_split($palabra); //descompongo la palabra en un array
for ($i=0; $i<($largo); $i++)
{
$change = array($i => "_");
//reemplazo para cada posicion del array la letra por "_"
$ejecucion = array_replace($arr_palabra, $change);
echo $ejecucion[$i];
//me devuelve "_ _ _ _ _ _ _ _ _ _ _"
}
P1: Necesito que este echo sea una variable: $newpalabra
algo asi como $newpalabra = echo $ejecucion[$i]; (cosa que no se puede obviamente)

-------------------------------------------------------------------------------------------------------------------
Problema 2:
$palabra2 = array($newpalabra); //viene del ejercicio anterior
$key = 'A'; //recibo una letra en una variable
$pos1 = strpos($palabra, $key); //averiguo la posicion de la primera A = 0
$pos2 = strpos($palabra, $key, $pos1)+1; //averiguo la posicion de la segunda A = 3ra
$pos3 = strpos($palabra, $key, $pos2)+1; //averiguo la posicion de la tercera A = 5ta
$pos4 = strpos($palabra, $key, $pos3)+1; //averiguo la posicion de la cuarta A = 7ma
$pos5 = strpos($palabra, $key, $pos4)+1; //averiguo la posicion de la quinta A = 10ma

Ahora bien, lo que necesito es lograr esto: A_ _A_A_A__A
a partir de $newpalabra: "_ _ _ _ _ _ _ _ _ _ _"

Lo que se me ocurrió es, sabiendo las posiciones en la cual deberia ir cada letra A,
hacer un array_replace por la posicion de cada $valor => $key
algo asi como:

$change = array($pos1 => $key); //remmplazo el primer "_" por una A
$ejecucion = array_replace($palabra2, $change);
$palabra3 = implode($ejecucion);

y así hasta reemplazar todas A, pero no me funciona! :(
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve

Problemas con arrays

Publicado por xve (5520 intervenciones) el 01/08/2016 21:36:32
Ejercicio 1...
Si lo que quieres es cambiar todos los caracteres por un guion... seria tan simple como:
1
2
3
4
5
6
7
8
<?php
$palabra='ABRACADABRA'; //variable que contiene una palabre de x longitud de caracteres
for ($i=0; $i<strlen($palabra); $i++)
{
	$newPalabra.="_";
}
echo $newPalabra;
?>

Te sirve?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Miguel

Problemas con arrays

Publicado por Miguel (4 intervenciones) el 01/08/2016 22:24:40
Genial, a pesar q eso ya lo tengo resuelto es una forma más simple. Incleible... Muchísimas gracias XVE !!!
Me podria explicar como funciona el ".=", soy amateur...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Problemas con arrays

Publicado por xve (5520 intervenciones) el 02/08/2016 08:41:41
Hola Miguel, eso lo que hace es concatenar...es decir juntar lo que hay después del igual (=) a la variable ($newPalabra)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de kip

Problemas con arrays

Publicado por kip (567 intervenciones) el 01/08/2016 22:24:47
Hola, aqui te dejo una funcion a la cual puedes enviar opcionalmente la letra que quieres que muestre de la palabra a reemplazar, espero se entienda y si tienes alguna duda comentanos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
 
function wordRepl($palabra,$letra=null){
	$repl = '_';
	if($letra){ //Si la letra fue enviada como argumento a la funcion
		for ($i=0,$s=strlen($palabra);$i<$s; $i++) {
			$n_palabra[]  = (strtoupper($palabra{$i})==strtoupper($letra)) ? $palabra{$i} : $repl;
		}
		return implode('',$n_palabra);
	} else { //Si la letra no fue enviada
		for ($i=0,$s=strlen($palabra);$i<$s; $i++) {
			$n_palabra[] = $repl;
		}
		return implode('',$n_palabra);
	}
}
 
$palabra = 'ABRACADABRA';
 
echo wordRepl($palabra,'A');

Como puedes notar puedes enviar la letra que deseas evaluar ya sea que este en mayusculas o minusculas, asi mismo la palabra en donde se hara la evaluacion.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Miguel

Problemas con arrays

Publicado por Miguel (4 intervenciones) el 01/08/2016 22:46:58
Que genio... tambien funciona de maravillas... Gracias de nuevo...
Como verás es para un jueguito de ahorcado que estoy haciendo para un jardin de infantes, el resto lo tengo casi resuelto, solo me faltaba esta salida que no podía hacer.
Ahora, si no es mucho pedir, y es lo ultimo que te pido, suponiendo que envio con un input A, luego B, Luego C... hasta completar la palabra, como sería la funcion con una salida de error, cuando la letra no existe?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip

Problemas con arrays

Publicado por kip (567 intervenciones) el 01/08/2016 23:14:34
Agregas una variable $error que se sumara a si misma en cada iteracion si dicha letra no fue encontrada en la palabra, luego del for se evaluara si el valor de la variable $error es diferente a la cantidad de letras que tiene la palabra, se hace esto para verificar que dicha letra no haya existido en ninguna posicion de la palabra en cuestion, dado que la letra que se busque puede estar a la mitad o al final, entonces la variable $error tendra un valor pero dicha letra si existiria aunque sea una sola vez en la palabra.

La variable $error debe tener el mismo valor entero que la longitud de la palabra para asi saber que la letra no existe en la misma, espero me entiendas.

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
 
function wordRepl($palabra,$letra=null){
	$repl = '_';
	$error = 0;
	if($letra){ //Si la letra fue enviada como argumento a la funcion
		for ($i=0,$s=strlen($palabra);$i<$s; $i++) {
			$n_palabra[]  = (strtoupper($palabra{$i})==strtoupper($letra)) ? $palabra{$i} : $repl ;
			if ($n_palabra[$i] == $repl) $error = $error+1;
		}
		if ($error!=strlen($palabra)){
			return implode('',$n_palabra);
		} else {
			return 'Letra no encontrada!';
		}
 
	} else { //Si la letra no fue enviada
		for ($i=0,$s=strlen($palabra);$i<$s; $i++) {
			$n_palabra[] = $repl;
		}
		return implode('',$n_palabra);
	}
}
 
$palabra = 'ABRACADABRA';
 
echo wordRepl($palabra,'S');

Nos comentas si te sirve.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Miguel

Problemas con arrays

Publicado por Miguel (4 intervenciones) el 01/08/2016 23:31:02
Si muy clara tu explicacion. Tal vez no me explique bien. Y todo funciona de maravillas, excelente tu código.
La intencion es que al recibir la A me devuelva A__A_A_A__A y al recibir la B, devuelva AB_A_A_AB_A permaneciendo el primer implode positivo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip

Problemas con arrays

Publicado por kip (567 intervenciones) el 02/08/2016 00:10:18
Para ello debes hacer uso de las variables $_SESSION, aqui el codigo:

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
<?php
session_start();
 
function wordRepl($palabra,$letra=null){
	$repl = '_';
	$error = 0;
 
	if($letra){ //Si la letra fue enviada como argumento a la funcion
		for ($i=0,$s=strlen($palabra);$i<$s; $i++) {
			if(strtoupper($palabra{$i})==strtoupper($letra)){
				$n_palabra[] = $palabra{$i};
			} elseif(isset($_SESSION['n_palabra']) && !empty($_SESSION['n_palabra'])){
				if (strtoupper($palabra{$i})==strtoupper($_SESSION['n_palabra']{$i})){
					$n_palabra[] = $palabra{$i};
				} else {
					$n_palabra[] = $repl;
				}
			} else {
				$n_palabra[] = $repl;
			}
			if(strtoupper($palabra{$i})!=strtoupper($letra)) $error = $error+1;
		}
		if ($error!=strlen($palabra)){
			$_SESSION['n_palabra'] = implode('',$n_palabra);
			return implode('',$n_palabra);
		} else {
			return 'Letra no encontrada!';
		}
	} else { //Si la letra no fue enviada
		for ($i=0,$s=strlen($palabra);$i<$s; $i++) {
			$n_palabra[] = $repl;
		}
		return implode('',$n_palabra);
	}
}
 
$palabra = 'ABRACADABRA';
 
echo wordRepl($palabra,'F');

Se vuelve un poco mas complejo, pero espero lo estudies y asi mismo entiendas.

Aqui tambien te dejo un codigo posteado hace algun tiempo en la web, es un juego de ahorcado:
http://www.lawebdelprogramador.com/codigo/PHP/3474-Juego-del-ahorcado.html

Ese codigo es mucho mas complejo ya que usa otras teconologias, pero no estaria mal que le echaras un ojo.

Espero te sirvan ambos codigos, si tienes alguna duda o el codigo que postee te da algun error, avisanos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar