Foros del Web » Programando para Internet » PHP »

¡No me asigna valores a mi arreglo!

Estas en el tema de ¡No me asigna valores a mi arreglo! en el foro de PHP en Foros del Web. Saludos: Resulta que tengo este pequeño código, pero me ha dado bastantes dolores de cabeza. No encuentro la forma de asignarle los valores que se ...
  #1 (permalink)  
Antiguo 23/05/2007, 00:08
Avatar de goc00  
Fecha de Ingreso: enero-2002
Ubicación: 000's DiMensiOn
Mensajes: 979
Antigüedad: 22 años, 3 meses
Puntos: 3
¡No me asigna valores a mi arreglo!

Saludos:

Resulta que tengo este pequeño código, pero me ha dado bastantes dolores de cabeza. No encuentro la forma de asignarle los valores que se van originando en la función recursiva a mi arreglo, ¿alguien tiene la respuesta a mi problema?.

El código:

Código PHP:
<?php
    $arreglo 
= array(0,0,0,0,0,0,0,0,0,0);
    
    
/* FUNCIÓN QUE CREA DECIMAL */
    
function creaDecimal($inicio,$fin) {
        
$decimal=0;
        
$entero rand($inicio,$fin);
        if(
$entero!=$fin) { // por si pongo creaDecimal(x,x)
            
$decimal rand(0,9)/10;
        }
        return (
$entero+$decimal); // decimal completo
    
}
    
    
/* FUNCIÓN RECURSIVA PARA GENERAR Y ALMACENAR LOS NÚMEROS EN EL ARREGLO */
    
function generaNumeros($i,$tope,$inicio,$fin,$suma) {
        if(
$tope $suma) {
            
$numero creaDecimal($inicio,$fin); // genera el decimal
            
$suma+=$numero// suma los números que se vayan generando
            
$arreglo[$i] = $numero// ACÁ ESTÁ EL ERROR, NO ESTÁ ASIGNANDO EL VALOR AL ARREGLO
            
$i++; // va aumentanto en 1 el índice
            
generaNumeros($i,$tope,$inicio,$fin,$suma);
        }
    }
    
    
// llama función
    
generaNumeros(0,100,10,15,0);
    
    
// leer datos
    
for($j=0;$j<count($arreglo);$j++) {
        echo 
$arreglo[$j]."<br>";
    }
?>
Como verán es muy simple, una función que genera número decimales, otra función recursiva que va generando los números, pasándole un tope, valor de inicio - fin del random y pretendo el número generado ir almacenándolo en un arreglo PERO NO LO HACE (al mostrar los valores del arreglo muestra los 0 predeterminados al momento que definí el arreglo).

¿Algún maestro que me salve?
__________________
GOC00 CominG soOn v2.0
CyA! & GooD LuCK...
  #2 (permalink)  
Antiguo 23/05/2007, 00:16
Avatar de tozanni  
Fecha de Ingreso: mayo-2007
Ubicación: Seattle, WA
Mensajes: 62
Antigüedad: 17 años
Puntos: 0
Re: ¡No me asigna valores a mi arreglo!

$arreglo es una variable global. Para usarla dentro de tu funcion necesitas declararla como en seguida, o pasarla en los argumentos de la funcion cada vez:

Código PHP:
function generaNumeros($i,$tope,$inicio,$fin,$suma) {
        global 
$arreglo
No es por criticar, pero ni las globales ni las funciones recursivas (excepto tal vez en LISP o Scheme) son del todo "cool", espero que tengas una buena razon para usarlas =)
  #3 (permalink)  
Antiguo 23/05/2007, 00:24
Avatar de goc00  
Fecha de Ingreso: enero-2002
Ubicación: 000's DiMensiOn
Mensajes: 979
Antigüedad: 22 años, 3 meses
Puntos: 3
Re: ¡No me asigna valores a mi arreglo!

Maestro que cosas... y yo ponía el global afuera y era cosa de ponerlo en la función, como siempre respuestas claras y precisas, MUCHAS GRACIAS!

Ahora por el tema de la recursividad y variables globales en PHP... totalmente de acuerdo contigo. PHP dispone un manejo de memoria horrible!, pero pensé que esta función recursiva es mínima (y me solventa el problema rápidamente), así que no debería traer ningún problema (lo mismo para las variables globales acaparando espacios de memoria y recursos "absolutos").

¿Te inclinarías por un método (perdón, función...) no recursiva?
__________________
GOC00 CominG soOn v2.0
CyA! & GooD LuCK...
  #4 (permalink)  
Antiguo 27/05/2007, 03:39
Avatar de tozanni  
Fecha de Ingreso: mayo-2007
Ubicación: Seattle, WA
Mensajes: 62
Antigüedad: 17 años
Puntos: 0
Mensaje Re: ¡No me asigna valores a mi arreglo!

El problema que yo le veo a la recursividad, mas que la eficiencia en el manejo de memoria es la mantenibilidad y la propensión a errores, ya que es relativamente fácil crear ciclos infinitos, y que los problemas pasen desapercibidos hasta que alguien los encuentra en produccion.

A mi se me hubiera ocurrido algo facilito con un while(). Aunque realmente no estoy seguro si es lo mismo que quieres hacer, este es un pseudo-codigo:

Código PHP:
while($suma $tope) {
   
$este_numero crea_decimal()
   
$suma += $este_numero;
   
array_push($numeros$este_numero);

  #5 (permalink)  
Antiguo 27/05/2007, 22:43
Avatar de goc00  
Fecha de Ingreso: enero-2002
Ubicación: 000's DiMensiOn
Mensajes: 979
Antigüedad: 22 años, 3 meses
Puntos: 3
Re: ¡No me asigna valores a mi arreglo!

Saludos:

Eso no es precisamente lo que quiero, lo que yo necesitaba era generar 10 porcentajes aleatorios (como máximo) sobre un total de 100% (o sea, que la suma de los porcentajes generados sea igual a 100%), y además el porcentaje que se genera no puede ser mayor a 15. Modifiqué el código para cumplir aquello, aunque lo sigo manteniendo recursivo (y no veo por donde pudiera fallar) ujaujAjUAja. Acá está por si quieres o quieren comentarlo, o a alguien más les puede servir:

Código PHP:
        $inverPorcentaje=array(0,0,0,0,0,0,0,0,0,0);

        
// función para crear decimal
    
function creaDecimal($inicio,$fin) {
        
$decimal=0;
        
$entero rand($inicio,$fin);
        if(
$entero!=$fin) {
            
$decimal rand(0,9)/10;
        }
        return (
$entero+$decimal); // decimal completo
    
}    
    
    
// función para disponer los porcentajes
    
function generaInversiones($i$tope$inicio$fin$sumaInversa) {
        global 
$inverPorcentaje;
        if (
$sumaInversa $fin) {
            
$numero creaDecimal($inicio,$fin);
            
$inverPorcentaje[$i] = $numero;
            
$sumaInversa -= $numero;
            
$i++;
            
generaInversiones($i$tope$inicio$fin$sumaInversa);
        } else {
            
$inverPorcentaje[$i] = $sumaInversa;
        }
    } 
__________________
GOC00 CominG soOn v2.0
CyA! & GooD LuCK...
  #6 (permalink)  
Antiguo 26/06/2007, 15:04
 
Fecha de Ingreso: octubre-2006
Ubicación: Madrid, Spain
Mensajes: 2
Antigüedad: 17 años, 6 meses
Puntos: 0
Re: ¡No me asigna valores a mi arreglo!

Tengo un problema con el siguiente script, no muestra nada cuando la recursividad va de regreso :S... llevo todo un día probando diferentes alternativas y llenandolo de alerts y nada.

Agradezco de antemano la ayuda...

<script>
items = [ ["Principal", "principal.php" , ["Usuarios", "user.php", "#"],["Base de Datos", "user.php", "#"]],["Principal", "principal.php" , Usuarios", "user.php", "#"], ["Base de Datos", "bd.php", "#"]]];

function ver()
{
res = "";
for (var i = 0; i < items.length; i++)
{
res+= "<b>Item " + i + ":</b><br>";
res+= verItem(items[i]);
}
document.getElementById('resul').innerHTML = res;
}

function verItem(it)
{
res = "";
res+= "Tamaño '"+ it.length +"'<br>";
res+= "Nombre: '" + it[0] + "'<br>";
res+= "Link: '" + it[1] + "'<br>";

for(j=2; j< it.length; j++)
{
res+= "<br>Hijo " + (j-1) + "de " + (it.length-2)+": " + it[j]+ "<br>";
if(it[j]!="#")
res+= verItem(it[j]);
}

res+="<br>Sale del for<br>";
//alert(res)
return res;
}
</script>

<table width="327" border="0" cellpadding="0" cellspacing="0">
<!--DWLayoutTable-->
<tr>
<td width="150" height="38">&nbsp;</td>
<td width="161">&nbsp;</td>
<td width="16">&nbsp;</td>
</tr>
<tr>
<td height="24"></td>
<td valign="top">
<form id="form1" name="form1" method="post" action="">
<input type="button" name="Submit" value="Ver" onclick="ver();"/><br>
</form>
</td>
<td></td>
</tr>
<tr>
<td height="16"></td>
<td></td>
<td></td>
</tr>
</table>
<div id="resul">
</div>
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:55.