2011-10-17 1 views
0

私は(に使用する必要があるmannorで)使用することはかなり困難である形式の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

のforeach()ループ。 –

+1

これは醜いことではありません。週の曜日をループして開始時刻と終了時刻を比較するだけです。ちょっと難しいのは、あなたが正しい順序で日付をカバーしていることを確認することですが、それはハードコーディングすることができます($ days_of_week = array( "Monday"、 "Tuesday"、...、 "Sunday") ; ')。 –

+1

週の曜日ごとにサブアレイが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

私の解決策を避けるためにしようとしています:

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 

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をし、それを維持することができます

あなたの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 :) 
関連する問題