Форматировать данные красиво - PullRequest
0 голосов
/ 17 октября 2011

Мне дают данные из API в формате, который довольно сложно использовать (в том случае, если это необходимо для использования) - у меня нет возможности изменять API.Ниже приведен пример данных, которые мне дают:

    $data = array(
        array('day' => 'Monday', 'start' => 1100, 'end' => 1300),
        array('day' => 'Tuesday', 'start' => 1100, 'end' => 1300),
        array('day' => 'Wednesday', 'start' => 1100, 'end' => 1300),
        array('day' => 'Thursday', 'start' => 1200, 'end' => 1300),
        array('day' => 'Friday', 'start' => 1200, 'end' => 1300),
        array('day' => 'Saturday', 'start' => 1200, 'end' => 1300),
        array('day' => 'Sunday', 'start' => 1200, 'end' => 1400)
    );

Данные могут не включать все семь дней недели, начало и конец варьируются от 0000 до 2400. Я пытаюсь найти способчтобы отформатировать данные со следующим выводом: Monday - Wednesday (1100-1300), Thursday - Saturday (1200-1300), Sunday (1200-1400) в основном, смежные дни (чьи начальное и конечное время совпадают) разделяются переносом.

Я стараюсь избежать огромного блока уродливыхкод

Ответы [ 2 ]

2 голосов
/ 17 октября 2011

Безобразие в глазах смотрящего.;) Я думаю, что это нормально, но, конечно, это может быть именно тем, чего вы пытаетесь избежать.

<?php
$data = array(
    array('day' => 'Monday', 'start' => 1100, 'end' => 1300),
    array('day' => 'Tuesday', 'start' => 1100, 'end' => 1300),
    array('day' => 'Wednesday', 'start' => 1100, 'end' => 1300),
    array('day' => 'Thursday', 'start' => 1200, 'end' => 1300),
    array('day' => 'Friday', 'start' => 1200, 'end' => 1300),
    array('day' => 'Saturday', 'start' => 1200, 'end' => 1300),
    array('day' => 'Sunday', 'start' => 1200, 'end' => 1400)
);

$periods = array();

$start = $end = $i = -1;

foreach ($data as $datum) {
    if ($start != $datum['start'] || $end != $datum['end']) {
        $i++;
        $start = $datum['start'];
        $end   = $datum['end'];

        $periods[$i] = array(
                          'start'    => $start, 
                          'end'      => $end,
                          'startDay' => $datum['day']);
    }
    $periods[$i]['endDay'] = $datum['day'];
}

foreach ($periods as $k => $period) {
    echo ($k) ? ', ' : '';
    if ($period['startDay'] === $period['endDay']) {
        echo $period['startDay'];
    } else {
        echo "{$period['startDay']} - {$period['endDay']}";
    }
    echo " ({$period['start']} - {$period['end']})";
}

Будет выводить:

Monday - Wednesday (1100 - 1300), Thursday - Saturday (1200 - 1300), Sunday (1200 - 1400)
0 голосов
/ 17 октября 2011

мое решение:

function data_to_array(&$data, $cols) {
  foreach($data as &$value) {
    $value = array_combine($cols, explode(',', $value));
  }
}

$data = Array(
  'Monday,1200,1400',
  'Monday,1200,1400',
  'Monday,1200,1400',
  'Monday,1200,1400',
  'Monday,1200,1400',
  'Monday,1200,1400',
  'Monday,1200,1400',
  'Monday,1200,1400',
  'Monday,1200,1400',
  'Monday,1200,1400',
  'Monday,1200,1400'
);

data_to_array($data, Array('day','start','end'));
// now $data is again ugly block of data :)

теперь вы можете сохранить его в текстовом файле data.txt:

Monday,1200,1400
Monday,1200,1400
Monday,1200,1400
Monday,1200,1400
Monday,1200,1400
Monday,1200,1400
Monday,1200,1400
Monday,1200,1400
Monday,1200,1400
Monday,1200,1400
Monday,1200,1400

ваш php файл:

$data = explode("\n", file_get_contents('data.txt'));
data_to_array($data, Array('day','start','end'));
// now $data is again ugly block of data :)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...