PDA

Ver la Versión Completa : Estructuras?¿


CHiCoLiTa
23-12-2004, 19:27:18
Como se traduce esto a php? Es posible?


type
TOpe = record
ope : string;
Visitas : string;
HorasTrabajadas : string;
EnviosSala : string;
end;

type
TFechas = record
dia : TDateTime;
operador : array of TOpe;
end;

type
TCampanas = record
campana : string;
descripcion : string;
fecha : array of TFechas;
end;



Mas que nada lo que me gustaria es poder acceder a los elementos del siguiente modo

var
Datos : array of TCampanas;
datos[i].fecha[j].operador[k].HorasTrabajadas


O como no existen punteros (eso he leido) no es posible?



Espero haberme expresado bien

Mick
27-12-2004, 01:46:16
Basta que utilices el sistema de arrays asociativos de php. No necesitas definir ningun tipo de estructura basta que asignes lo que necesites al vuelo,
puedes asignar arrays dentro de arrays, por ejemplo:


$datos= array();


// Añadimos el primer elemento al array $datos
$datos[]= array( 'campana' => '01',
'descripcion' => 'campana numero 01',
'fecha' => array(
array( 'dia' => 1, 'operador' => ... ),
array( 'dia' => 2, 'operador' => ... ),
array( 'dia' => 3, 'operador' => ... ),
...
)
);
// Añadimos el segundo elemento al array $datos
$datos[]= array( 'campana' => '02',
'descripcion' => 'campana numero 02',
'fecha' => array(
array( 'dia' => 1, 'operador' => ... ),
array( 'dia' => 2, 'operador' => ... ),
...
)
);



Tienes mas informacion sobre el manejo de arrays, en la ayuda online de php (www.php.net).

Saludos

kayetano
27-12-2004, 16:25:09
Hola

Mick tiene mucha razon, los arrays en PHP permiten indices de todas clases, numeros y texot.

EstebanWeb
28-12-2004, 14:58:01
Recordá que en PHP las variables no son tipadas (no tienen un tipo como integer,char,etc.) son solo contenedores de datos.
Por lo que como digieron los amigos que me antecedieron con array anidados se soluciona el problema

espero que sirva el comentario

CHiCoLiTa
29-12-2004, 13:29:37
Ese tipo de arrays los conozco, pero, ¿como le digo yo que quiero insertar un operador de la campaña 3 y la fecha 2?
Lo que no se es recorrerlos para insertar datos o buscar valores dados unos patrones

En delphi primero obtenia las fechas y las metia en la estructura, luego tenia todos los operadores y los añadia por fecha en la estructura, y por ultima obtenia el resto de los datos por operadores / dia y los metia en su correspondiente lugar. Una vez que estaba llena la estructura iba imprimiendo.

Me parece a mi que no tengo demasiado clara la idea de array asociativo

Es decir como meto primero las fechas 01/01/04, 02/01/04
Una vez que tengo todas, meto los operadores ope01, ope02, ope03
y para terminar meter por ejemplo 7 visitas el 01/01/04 al ope01, 2 el 02/01/04 al ope003...

roman
29-12-2004, 22:07:38
Simplemente hazlo por partes, por ejemplo



// Llenas un arreglo de fechas asignando sólo el campo dia
$fecha[0]['dia'] = strtotime('2004-12-24');
$fecha[1]['dia'] = strtotime('2004-12-28');
$fecha[2]['dia'] = strtotime('2004-12-31');

// llenas un arreglo de operadores
$operador[0] = array(
'ope' => 'ope01', 'Visitas' => '7',
'HorasTrabajadas' => '3', 'EnviosSala' => '5');

$operador[1] = array(
'ope' => 'ope02', 'Visitas' => '3',
'HorasTrabajadas' => '12', 'EnviosSala' => '7');

// asignas estos operadores a la primera fecha
$fecha[0]['operador'] = $operador;

/*
de la misma forma asignas operadores a la segunda fecha
*/

// asignas el arreglo de fechas a una campana
$campana = array('campana' => '01', 'descripcion' = campana 01');
$campana['fecha'] = $fecha;


Por otra parte- aunque es cuestión de estilo de programación - yo cambiaría
algunos nombres. Es confuso hablar de $campana['fecha'] cuando en realidad
son varias fechas; mejor sería $campana['fechas']. Lo mismo con $campana
['fecha'][0]['operador'] ya que son varios operadores, así que mejor sería
$campana['fechas'][0]['operadores'].

También, aunque es prácticamente lo mismo en cuanto a nomenclatura, yo
preferiría usar clases para estructuras tan ramificadas como las que tienes.

Por ejemplo, implementaría estas tres clases:



class Operador
{
var $operador;
var $visitas;
var $horas_trabajadas;
var $envios_sala;
}

class Fecha
{
var $dia;
var $operadores;

function Fecha()
{
$this->operadores = array();
}
}

class Campana
{
var $campana;
var $descripcion;
var $fechas;

function Campana()
{
$this->fechas = array();
}
}


Los métodos de una clase los implementas dentro de la misma definición de la
clase. El método cuyo nombre es igual al nombre de la clase es el constructor
donde puedes aprovechar para inicializar algunos valores como en el caso de
Fecha y Campana en donde inicializo las propiedades operadores y fechas a
arreglos vacíos.

$this, dentro de una clase es equivalente al Self de Delphi.

Para instanciar una clase usas su constructor y el operador new:



$campana = new Campana();


Cada elemento del arreglo $campana->fechas deberás crearlo también con
new Fecha() y lo mismo para la propiedad operadores de la clase Fecha. Aquí
algunos ejemplos:



// llenar campos descriptivos de $campana
$campana->campana = '01';
$campana->descripcion = 'primera campana';

// agregar dos instancias de la clase Fecha al arreglo $campana->fechas
$campana->fechas[0] = new Fecha();
$campana->fechas[0]->dia = strtotime('2004-01-01');

$campana->fechas[1] = new Fecha();
$campana->fechas[1]->dia = strtotime('2004-01-02');

// agregar dos operadores a la fecha 0
$campana->fechas[0]->operadores[0] = new Operador();
$campana->fechas[0]->operadores[0]->operador = 'ope01';

$campana->fechas[0]->operadores[1] = new Operador();
$campana->fechas[0]->operadores[1]->operador = 'ope02';

// agregar tres operadores a la fecha 1
$campana->fechas[1]->operadores[0] = new Operador();
$campana->fechas[1]->operadores[0]->operador = 'ope03';

$campana->fechas[1]->operadores[1] = new Operador();
$campana->fechas[1]->operadores[1]->operador = 'ope01';

$campana->fechas[1]->operadores[1] = new Operador();
$campana->fechas[1]->operadores[1]->operador = 'ope12';


A un constructor le puedes pasar parámetros para facilitar un poco la
escritura. Por ejemplo, el constructor de la clase Fecha lo puedes cambiar
así:



function Fecha($dia)
{
$this->dia = $dia;
$this->operadores = array();
}


de manera que



// agregar dos instancias de la clase Fecha al arreglo $campana->fechas
$campana->fechas[0] = new Fecha();
$campana->fechas[0]->dia = strtotime('2004-01-01');

$campana->fechas[1] = new Fecha();
$campana->fechas[1]->dia = strtotime('2004-01-02');


lo reduces a



$campana->fechas[0] = new Fecha(strtotime('2004-01-01'));
$campana->fechas[1] = new Fecha(strtotime('2004-01-02'));


Finalmente, aunque no venga al caso, cuando tengo estructuras tan
ramificadas suelo poner:



<pre>
<?
print_r($campana);
?>
</pre>

para poder ver la estructura completa y saber así si estoy en el camino correcto en la jungla :D.

// Saludos

kayetano
30-12-2004, 15:44:22
Hola

roman, estas de vacaciones ¿verdad?, vaya currada!!, esto es una respuesta y lo demas es toneria :)

Feliz año a todos.

CHiCoLiTa
03-01-2005, 11:09:53
Roman me has dejado sin palabras :eek: con la clase particular de php. No solo me ha quedado claro como usar los arrays asociativos, sino que tambien me has dado la idea de usar una clase para poder trabajar como queria. Pero no contento con eso, hasta has puesto un ejemplo.

Muchas gracias por tu tiempo y dedicacion