bueno me parecio interesante este post jeje me llamo la curiosidad, aunque php5.3 dispone de la clase DateInterval que haria lo que quieres obtener osea sumar de 15 minutos en 15 y en caso de encontrar un dato que coincida en la hora saltar o llenar automaticamente ese espacio de nombre
bueno empezemos
creamos una clase del tipo Vector,
en realidad es la clase arrayIterator extendida
nos ahorrara unos cuantos caracteres al escribir
Vector.clase.phpCódigo PHP :
<?php
/*
$array = new ArrayIterator(array("el1","el2"));
sera igual que
$array = new Vector("el1","el2");
*/
class Vector extends arrayIterator
{
public function __construct()
{
$argumentos = & func_get_args();
parent::__construct($argumentos);
}
}
?>
ahora creamos nuestra magica clase que nos facilita lo de adicionar horas ,minutos,segundos y por si acaso dias
no sabia como llamarla asi que le puse "reloj"
reloj.clase.phpCódigo PHP :
<?php
/**
* esta clase convierte strings en int y suma los minutos y horas adecuadamente
* inspirado en el post de http://foros.cristalab.com/crear-listado-de-horas-desde-array-t95960/
* @author tuadmin
* @version 1.0
* @package ejemplos
**/
//namespace ejemplos
class reloj
{
public $dia = 0;
public $hora = 0;
public $minuto = 0;
public $segundo = 0;
public static function newInstance($hora_string)
{
return new self($hora_string);
}
public function __construct($hora_string)
{
//sprintf("%02d:%02d:%02d", $hora_string,$this->hora, $this->minuto, $this->segundo);
list($this->hora, $this->minuto, $this->segundo) = sscanf($hora_string, "%d:%d:%d");
}
/**
* con esto volvemos a cambiar la hora
* @param string $hora_string de la hora del formato 'hora:minuto:segundo'
* @return void
**/
public function reajustar($hora_string)
{
list($this->hora, $this->minuto, $this->segundo) = sscanf($hora_string, "%d:%d:%d");
return $this;
}
/**
* con esto adicionamos dias la hora
* @param int $dias numero de dias a agregar al hora actual
* @return void
**/
public function addDias($dias)
{
$this->dia = $this->dia +$dias;
return $this;
}
/**
* con esto adicionamos horas a la hora
* @param int $horas numero de horas a agregar al hora actual
* @return void
**/
public function addHoras($horas)
{
$total = $this->hora + $horas;
$dias = floor($total / 24);
$this->hora = $total - ($dias * 24 );
$this->addDias($dias);
return $this;
}
/**
* con esto adicionamos minutos la hora
* @param int $minutos numero de minutos a agregar al hora actual
* @return reloj
**/
public function addMinutos($minutos)
{
$total = $this->minuto + $minutos;
$hora = floor($total / 60);
$this->minuto = $total - ($hora * 60 );
$this->addHoras($hora);
return $this;
}
/**
* con esto adicionamos segundos la hora
* @param int $segundos numero de segundos a agregar a la hora actual
* @return reloj
**/
public function addSegundos($segundos)
{
$total = $this->segundo + $segundos;
$minuto = floor($total / 60);
$this->segundo = $total - ($minuto * 60 );
$this->addMinutos($minuto);
return $this;
}
/**
* el formato es del tipo que usa printf
* @param string $format formato del string ej. "%02d:%02d:%02d"
* @return string
**/
public function getFormat($format = "%02d:%02d:%02d")
{
return sprintf($format, $this->hora, $this->minuto, $this->segundo);
}
}
?>
bueno ahora lo implementamos a la pregunta de nuestro amigo
que tiene de ejemplo estos datos
datos.phpobserven q utilizo la clase vector noten la diferencia entre la clase q creamos Vector y la de ArrayIterator
Código PHP :
<?php
//todos los arrays hacen lo mismo con distinta forma de crearlos
$datos = new ArrayIterator(array(
"08:00:00" => new Vector
(
'08:00:00','08:30:00','sandra d'
) ,
"10:00:00" => new ArrayIterator
( array(
'10:00:00',
'10:45:00',
'paloma s' )
),
"20:00:00" => new Vector("20:00:00","21:15:00","pedro pedrales");
));
?>
ahora ponemos todo en marcha
lo demas creo ya esta explicado en los comentarios
ejemplo1.phpCódigo PHP :
<?php
require 'Vector.clase.php';
require 'reloj.clase.php';
require 'datos.php';
//instanciamos de la forma larga
$reloj = new reloj("8:00:00");
//$reloj = reloj::newInstance("8:00:00");
//ponemos en un bucle condicinal hasta que se cumpla nuestra condicion
//while($reloj->hora < 23 AND $reloj->minutos < 60)
while($reloj->hora < 23)
{
//almacenamos en una variable para ahorrar el proceso que hace getFormat()
$formato = $reloj->getFormat();
//verificamos que la hora exista en nuestro array de datos
if($datos->offsetExists( $formato ))
{
//si existe obtenemos la posicion 2 del sub array que contiene el nombre
$nombre = $datos->offsetGet( $formato )->offsetGet(2);
//obtenemos tambien la hora de finalizacion del mismo q esta en
// la posicion 1 del sub array
$reloj->reajustar($datos->offsetGet( $formato )->offsetGet(1));
//mostramos en forma decorativa los horarios aunque esto se aplicaria mejor a un contenedor de tipo DIV de html
echo '+' . str_repeat('-',38). '+';
echo "\n";
echo '+-' . str_pad("$formato : $nombre",37,' ',STR_PAD_RIGHT) . '+';
echo "\n";
echo '+-' . str_pad( $reloj->getFormat() . " : $nombre" ,37,' ',STR_PAD_RIGHT) . '+';
echo "\n";
echo '+' . str_repeat('-',38). '+';
echo "\n";
}
else
{
//mostramos el formato de hora actual
echo "$formato\n";
}
//incrementamos nuestra hora en 15 minutos
$reloj->addMinutos(15);
}
?>