Foros del Web » Programando para Internet » PHP »

Juntar o unir dos índices de un array?

Estas en el tema de Juntar o unir dos índices de un array? en el foro de PHP en Foros del Web. Hola, tengo un array que almacena rangos horarios: Código PHP: Array (     [ 0 ] =>  05 : 00      [ 1 ] =>  09 : 00 ...
  #1 (permalink)  
Antiguo 27/05/2014, 06:05
Avatar de reborn  
Fecha de Ingreso: febrero-2010
Mensajes: 440
Antigüedad: 9 años, 10 meses
Puntos: 1
Juntar o unir dos índices de un array?

Hola,

tengo un array que almacena rangos horarios:

Código PHP:
Array
(
    [
0] => 05:00
    
[1] => 09:00
    
[2] => 07:00
    
[3] => 07:00

Entonces, el indice 0 y 1 es un rango y el indice 2 y 3 es otro.
Hay alguna forma de juntarlos para q tengan mas "forma" de rango? y no sean indices sueltos.

O alguna otra idea q no se me ocurra para tratar con rangos

Gracias
  #2 (permalink)  
Antiguo 27/05/2014, 06:13
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 11 años, 7 meses
Puntos: 326
Respuesta: Juntar o unir dos índices de un array?

Todo depende de lo que necesites...

Puedes recorrer el array con un foreach, y distribuirlos en uno nuevo...

O bien, cuando tengas q tratar los ragos, si lo haces con un for, puedes hacer un $i+2, y buscar en las posiciones $i y $i+1...
__________________
>> Eleazan's Source
>> @Eleazan
  #3 (permalink)  
Antiguo 27/05/2014, 06:42
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 12 años, 8 meses
Puntos: 292
Respuesta: Juntar o unir dos índices de un array?

Seria buena idea crees TU tipo de datos y podria llamarse TimeRange:

Código PHP:
Ver original
  1. Interface ITimeRange
  2. {
  3.     public function setIni($time);
  4.     public function setFin($time); 
  5. }
  6.  
  7. /*
  8.     @author: Pablo Bozzolo (italico76)
  9. */
  10. Class TimeRange implements ITimeRange
  11. {
  12.     protected $ini;
  13.     protected $fin;
  14.    
  15.     public function __construct($ini=null,$fin=null)
  16.     {
  17.  
  18.         if (!empty($ini))      
  19.             $this->ini = $ini;             
  20.            
  21.         if (!empty($fin))      
  22.             $this->fin = $fin;                         
  23.     }
  24.    
  25.     /*
  26.         @author: glavic at gmail dot com
  27.     */
  28.     protected function validateDate($date, $format = 'Y-m-d H:i:s')
  29.     {
  30.         $d = DateTime::createFromFormat($format, $date);
  31.         return $d && $d->format($format) == $date;
  32.     }
  33.    
  34.     public function setIni($time)
  35.     {
  36.         if ((!$this->validateDate($time,'h:i')) AND (!$this->validateDate('0'.$time,'h:i')))
  37.             throw new Exception ("Formato de tiempo invalido $time");
  38.            
  39.         $this->ini = $time;
  40.         return $this;
  41.     }
  42.    
  43.     public function setFin($time)
  44.     {
  45.         if ((!$this->validateDate($time,'h:i')) AND (!$this->validateDate('0'.$time,'h:i')))
  46.             throw new Exception ("Formato de tiempo invalido $time");
  47.        
  48.         $this->fin = $time;
  49.         return $this;
  50.     }
  51.    
  52.     public function getIni()
  53.     {      
  54.         return $this->ini;
  55.     }
  56.    
  57.     public function getFin()
  58.     {      
  59.         return $this->fin;
  60.     }
  61.    
  62.     public function getRange()
  63.     {      
  64.         return array($this->ini,$this->fin);
  65.     }
  66. }

Asi lo usas:

Código PHP:
Ver original
  1. // Cargo datos:
  2. // admito distintas formas para introducirlos
  3.  
  4. $rangos = array();
  5. $rangos[] = new TimeRange('6:30','8:00');  // mi forma preferida :-)
  6. $rangos[] = (new TimeRange)->setIni('05:00')->setFin('09:00');  // otra forma soportada
  7. $rangos[] = (new TimeRange)->setIni('7:00')->setFin('7:00');
  8.  
  9.  
  10. // ...
  11.  
  12. // los leo cuando los necesito
  13.  
  14. foreach ($rangos as $t)
  15.     echo $t->getIni().' a '.$t->getFin()."\n<br/>";

Logicamente se hace un chequeo de "formato de tiempo valido" en la clase... podria ser opcional pero se hace de una vez por seguridad y otros tipos de formatos que podrias admitir (con AM / PM) y otras formas de hacer los chequeos de validez

La clase y la interfaz deben ser incluidas como librerias al inicio de tu script por prolijidad


Documentacion:

http://www.php.net/manual/en/datetime.formats.date.php
http://www.php.net/manual/en/datetime.formats.time.php

--
Creeria que la forma mas facil de cargar los datos es usando el constructor:

Código PHP:
Ver original
  1. $rangos[] = new TimeRange('6:30','8:00');
  2. $rangos[] = new TimeRange('9:00','5:30');
__________________
Salu2!

Última edición por Italico76; 27/05/2014 a las 09:14
  #4 (permalink)  
Antiguo 27/05/2014, 10:38
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 6 años, 5 meses
Puntos: 379
Respuesta: Juntar o unir dos índices de un array?

La pregunta es por que decidiste manejar de esa forma los rangos ? creo que es mas sencillo si trabajas con una estructura de este tipo:
Cita:
Array (
[0] => Array ( [0] => 05:00 [1] => 09:00 )
[1] => Array ( [0] => 07:00 [1] => 07:00 )
)
No lo mencionas pero si el problema es convertirlo, como los rangos estan en pares puedes usar array_chunk para extraer una porción y reasignarla a un nuevo arreglo.

Igual como te dice Italico76 puedes crear una clase que te maneje los rangos o usar la que ya te proporciono.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #5 (permalink)  
Antiguo 27/05/2014, 11:00
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 12 años, 8 meses
Puntos: 292
Respuesta: Juntar o unir dos índices de un array?

@hhs : en mi opinion seria bueno PHP tuviera algo mas simple que clases par aguardar estructuras, algo como Struct de C / C++
__________________
Salu2!
  #6 (permalink)  
Antiguo 27/05/2014, 13:01
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 6 años, 5 meses
Puntos: 379
Respuesta: Juntar o unir dos índices de un array?

Esa parte ya la tienes con los arreglos.
En C
Código C:
Ver original
  1. struct database {
  2.   int id_number;
  3.   int age;
  4.   float salary;
  5. };
  6.  
  7.  
  8.   struct database employee;  
  9.  
  10.   employee.age = 22;
  11.   employee.id_number = 1;
  12.   employee.salary = 12000.21;
En php
Código PHP:
Ver original
  1. $employee = array();
  2.  
  3. $employee['age'] = 22;
  4. $employee['id_number'] = 1;
  5. $employee['salary'] = 12000.21

El punto es que en C existen las estructuras para que puedas agrupar datos de diferente tipo como una unidad. Pero si me gustarla saber por que crees que serian bueno tenerlas
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #7 (permalink)  
Antiguo 27/05/2014, 13:08
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 12 años, 8 meses
Puntos: 292
Respuesta: Juntar o unir dos índices de un array?

Cita:
Iniciado por hhs Ver Mensaje
El punto es que en C existen las estructuras para que puedas agrupar datos de diferente tipo como una unidad. Pero si me gustarla saber por que crees que serian bueno tenerlas
Esta estructura es fragil:

Código PHP:
Ver original
  1. $employee = array();
  2.  
  3. $employee['age'] = 22;
  4. $employee['id_number'] = 1;
  5. $employee['salary'] = 12000.21;

Que pasaria si escribo mal el indice y pongo 'salari' en $employee ?

Las estructuras de C (struct) son rigidas, mientras los arreglos en PHP son tan laxos como un flan.


Por otro lado quizas me quieras llavar a hablar del hecho de que si bien es cierto que PHP es "dinamicamente tipado" tambien, existe type hinting pero no aplica para arreglos.
__________________
Salu2!

Última edición por Italico76; 27/05/2014 a las 13:27
  #8 (permalink)  
Antiguo 27/05/2014, 14:35
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 6 años, 5 meses
Puntos: 379
Respuesta: Juntar o unir dos índices de un array?

Cita:
Por otro lado quizas me quieras llavar a hablar del hecho de que si bien es cierto que PHP es "dinamicamente tipado" tambien, existe type hinting pero no aplica para arreglos.
No, no lo creo no soy defensor del lenguaje. Entiendo tu punto, tu quieres algo como el struct que se usa en Ruby y que es algo como lo que haces con C. Pero el detalle con php es que con arreglos o con clases con propiedades publicas obtienes la funcionalidad de las estructuras, asi que no creo que veamos un cambio en ese sentido.
La mejora en el Type Hiting la tendremos que esperar quizá en la versión 6, mientras tanto hay que relajarse.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #9 (permalink)  
Antiguo 27/05/2014, 15:03
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 12 años, 8 meses
Puntos: 292
Respuesta: Juntar o unir dos índices de un array?

Cita:
Iniciado por hhs Ver Mensaje
No, no lo creo no soy defensor del lenguaje. Entiendo tu punto, tu quieres algo como el struct que se usa en Ruby y que es algo como lo que haces con C. Pero el detalle con php es que con arreglos o con clases con propiedades publicas obtienes la funcionalidad de las estructuras, asi que no creo que veamos un cambio en ese sentido.
Pues si.. seria como una clase con atributos publicos,...... voy a crear ese tipo de dato y lo publicare creo aqui, su uso sera asi:

Código PHP:
Ver original
  1. // creo la estructura
  2. $st_persona = (new Struct('persona'))
  3.     ->create('nombre','NN','string')
  4.     ->create('apellido',null,'string')
  5.     ->create('edad',null,'int')
  6.     ->create('sexo_masc',true,'bool')
  7.     ->create('telefono','000-00000','string');
  8.  
  9. // la uso :)
  10. $st_persona->nombre  = 'Pablo';
  11. $st_persona->apellido  = 'Bozzolo';
  12. $st_persona->edad = 32;

La ventaja sera que no permitira meter cualquier cosa por error que no cuadre con el nombre de un campo o no respete su tipo si es que se especifica
__________________
Salu2!

Última edición por Italico76; 27/05/2014 a las 23:04

Etiquetas: juntar
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 10:43.