División de matriz basada en un intervalo de tiempo en PHP

Estoy buscando una forma de dividir la matriz en función de un intervalo de tiempo contenido dentro de la matriz. Entonces, por ejemplo,

Array (
   [0] => Array (
               ['type'] => Text Format
               ['interval'] => 30
               ['init'] => 2012-04-30 09:00:00
               ['final'] => 2012-04-30 10:00:00
           )
   [1] => Array (
               ['type'] => Word Format
               ['interval'] => 12
               ['init'] => 2012-04-28 13:00:00
               ['final'] => 2012-04-28 13:30:00
           )
)

dividirlo en:

Array (
   [0] => Array (
               ['type'] => Text Format
               ['interval'] => 30
               ['init'] => 2012-04-30 09:00:00
               ['final'] => 2012-04-30 09:30:00
           )
   [1] => Array (
               ['type'] => Text Format
               ['interval'] => 30
               ['init'] => 2012-04-30 09:30:00
               ['final'] => 2012-04-30 10:00:00
           )
   [2] => Array (
               ['type'] => Word Format
               ['interval'] => 12
               ['init'] => 2012-04-28 13:00:00
               ['final'] => 2012-04-28 13:12:00
           )
   [3] => Array (
               ['type'] => Word Format
               ['interval'] => 12
               ['init'] => 2012-04-28 13:12:00
               ['final'] => 2012-04-28 13:24:00
           )
)

¿Cuál sería una buena forma de hacer esto?

preguntado el 03 de mayo de 12 a las 21:05

3 Respuestas

Esto podría funcionar para usted ... solo estoy comparando con un máximo de 20 intervalos

$dates = Array (
        0 => Array (
                'type' => "Text Format",
                'interval' => "30",
                'init' => "2012-04-30 09:00:00",
                'final' => "2012-04-30 10:00:00" 
        ),
        1 => Array (
                'type' => "Word Format",
                'interval' => 12,
                'init' => "2012-04-28 13:00:00",
                'final' => "2012-04-28 13:30:00" 
        ) 
);

echo "<pre>";

$output = array ();

foreach ( $dates as $key => $value ) {
    makeDates ( $value ['init'], $value ['final'], $value ['interval'], $value ['type'] ,$output);
}

var_dump ( $output );
function makeDates($start, $end, $min, $type, &$output) {
    $start = new DateTime ( $start );
    $end = new DateTime ( $end );

    $interval = new DateInterval ( 'PT' . $min . 'M' );

    for($i = 0; $i < 20; $i ++) {
        $list = array ();
        $list ['type'] = $type;
        $list ['interval'] = $min;
        $list ['init'] = $start->format ( 'Y-m-d H:i:s' );

        $start->add ( $interval );

        $list ['final'] = $start->format ( 'Y-m-d H:i:s' );

        if ($start == $end) {
            $output [] = $list;
        }

        if ($start >= $end) {
            break;
        }

        $output [] = $list;

    }

    return $output;
}

Salida

array
  0 => 
    array
      'type' => string 'Text Format' (length=11)
      'interval' => string '30' (length=2)
      'init' => string '2012-04-30 09:00:00' (length=19)
      'final' => string '2012-04-30 09:30:00' (length=19)
  1 => 
    array
      'type' => string 'Text Format' (length=11)
      'interval' => string '30' (length=2)
      'init' => string '2012-04-30 09:30:00' (length=19)
      'final' => string '2012-04-30 10:00:00' (length=19)
  2 => 
    array
      'type' => string 'Word Format' (length=11)
      'interval' => int 12
      'init' => string '2012-04-28 13:00:00' (length=19)
      'final' => string '2012-04-28 13:12:00' (length=19)
  3 => 
    array
      'type' => string 'Word Format' (length=11)
      'interval' => int 12
      'init' => string '2012-04-28 13:12:00' (length=19)
      'final' => string '2012-04-28 13:24:00' (length=19)

contestado el 03 de mayo de 12 a las 21:05

Un par de cosas para ponerte en el camino correcto:

  1. No puede comparar cadenas de fecha/hora directamente en PHP, convertirlas en marca de tiempo

  2. Compare init y final y verifique si la diferencia> intervalo

  3. Si la diferencia <= intervalo, ya está

  4. Si diferencia> intervalo, cree una nueva matriz y agregue un intervalo a init. Ir al paso 2

¡Muéstranos el código!

contestado el 03 de mayo de 12 a las 21:05

Dado lo que proporcionó, esto debería hacerlo:

foreach($old as $o) {
    $interval= $o['interval'];
    $new[] = $o;
    $x = count($new)-1;
    $new[$x]['final'] = date("Y-m-d H:i:s",strtotime("+$interval minutes", strtotime($old[$x]['init'])));

    $new[] = $o;
    $y = count($new)-1;
    $new[$y]['init'] = $new[$x]['final'];
    $new[$y]['final']   = date("Y-m-d H:i:s",strtotime("+$interval minutes", strtotime($new[$y]['init'])));
}

echo "Old:<pre>".print_r($old,true)."</pre>";
echo "New<pre>".print_r($new,true)."</pre>";

Mi salida probada:

Old:
Array
(
    [0] => Array
        (
            [type] => Text Format
            [interval] => 30
            [init] => 2012-04-30 09:00:00
            [final] => 2012-04-30 10:00:00
        )

    [1] => Array
        (
            [type] => Word Format
            [interval] => 12
            [init] => 2012-04-28 13:00:00
            [final] => 2012-04-28 13:30:00
        )

)

New
Array
(
    [0] => Array
        (
            [type] => Text Format
            [interval] => 30
            [init] => 2012-04-30 09:00:00
            [final] => 2012-04-30 09:30:00
        )

    [1] => Array
        (
            [type] => Text Format
            [interval] => 30
            [init] => 2012-04-30 09:30:00
            [final] => 2012-04-30 10:00:00
        )

    [2] => Array
        (
            [type] => Word Format
            [interval] => 12
            [init] => 2012-04-28 13:00:00
            [final] => 1969-12-31 16:12:00
        )

    [3] => Array
        (
            [type] => Word Format
            [interval] => 12
            [init] => 1969-12-31 16:12:00
            [final] => 1969-12-31 16:24:00
        )

)

contestado el 03 de mayo de 12 a las 23:05

¿Este código solo funciona para el ejemplo proporcionado? ¿Qué pasa si el intervalo es de 10 minutos para la primera matriz? - ilanco

Utiliza cualquiera que sea el intervalo del elemento actual. El ejemplo dado parecía estar en minutos, así que eso es lo que usa mi respuesta. - PIB

Sin embargo, entendí que la pregunta era terrible la matriz dada basado sobre el intervalo dado, no para determinar ningún intervalo. Los ejemplos presentados parecen respaldar esa comprensión. - PIB

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.