2011-10-17 2 views
0

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 사이에서 변화 시작 및 종료, 일주일의 모든 7 일 포함되지 않을 수 있습니다 : 다음은 내가 제공하고있는 데이터의 예입니다 다음 출력을 가진 데이터 : Monday - Wednesday (1100-1300), Thursday - Saturday (1200-1300), Sunday (1200-1400) 기본적으로 인접한 요일 (시작 시간과 종료 시간은 동일 함)은 하이픈으로 구분됩니다.

나는 종류의 추한 코드의 거대한 블록을 피하기 위해 노력하고

+2

의 foreach() 루프. –

+1

전혀 못 생겨서는 안되며, 요일을 반복하고 시작과 끝 시간을 비교하십시오. 약간 까다로운 부분은 당신이 올바른 순서로 날짜를 포함하고 있는지 확인하는 것이지만, 그것은 하드 코딩 될 수 있습니다 ('$ days_of_week = array ("Monday", "Tuesday", ..., "Sunday") ;). –

+1

요일별로 하나의 하위 배열 만 보장됩니까? –

답변

2

우울함은 보는 사람의 눈에 있습니다. ;) 나는 이것이 괜찮다고 생각하지만 물론 당신이 피하려고하는 것일 수도있다.

<?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

분명히, 내 솔루션은 데이터가 올바른 순서로 처음에 발생한다고 가정합니다. 또한, 코드가 엉망으로 보이게하는 것에 관심이 있다면, 다른 곳의 함수 라이브러리 나 클래스에 코드를 넣고 Utilities : formatDatesNicely ($ data)를 호출하십시오. =) –

0

내 솔루션 :

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 :)