2011-10-17 44 views
0

我從API中獲取數據的格式非常難以使用(在需要使用的mannor中) - 我無法修改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)基本上,連續幾天(其開始和結束時間相同)由一個henn分開。

我種的試圖避免的醜陋的代碼一塊巨大

+2

foreach()循環。 – 2011-10-17 19:16:11

+1

它不應該是那麼醜陋,只是循環一週的日子,比較開始和結束時間。唯一有點棘手的部分是確保你按照正確的順序覆蓋了幾天,但可以用硬編碼('days_of_week = array(「Monday」,「Tuesday」,...,「Sunday」)) ;')。 – 2011-10-17 19:16:14

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