2017-11-28 14 views
0

は私が日時データの配列を含む入力配列を持っています。今、私は、共通の時間は一つの要素として表示され、時間が1日以上同じであるならば、それが必要だグループにしたい複数の配列要素を共通のデータに結合するにはどうすればよいですか?

$temp = Array 
(
    [0] => Array 
     (
      [day] => Tuesday 
      [time] => 07:44 pm - 08:44 pm 
     ) 

    [1] => Array 
     (
      [day] => Tuesday 
      [time] => 04:00 am - 04:25 am 
     ) 

    [2] => Array 
     (
      [day] => Sunday 
      [time] => 04:00 am - 04:25 am 
     ) 

    [3] => Array 
     (
      [day] => Sunday 
      [time] => 04:00 am - 04:25 am 
     ) 

    [4] => Array 
     (
      [day] => Friday 
      [time] => 04:00 am - 04:25 am 
     ) 

    [5] => Array 
     (
      [day] => Friday 
      [time] => 04:00 am - 04:25 am 
     ) 
) 

1つのエントリを表示します。これをあまりにも複雑にすることなく、望みの結果を達成する最良の方法は何ですか?

Array 
(
    [0] => Array 
     (
      [day] => Tuesday 
      [time] => 04:00 am - 04:25 am & 07:44 pm - 08:44 pm 
     ) 

    [1] => Array 
     (
      [day] => Friday & Sunday 
      [time] => 04:00 am - 04:25 am 
     ) 
) 

ここでは、私がやっていることだ。

$final = []; 
foreach ($temp as $val) { 
    $final[strtolower($val['day'])][] = $val['time']; 
} 
foreach ($final as $k => $v) { 
    sort($v); 
    $v = array_unique($v); 
    $last = array_pop($v); 
    $final[$k] = [ 
     'day' => $k, 
     'time' => count($v) ? implode(", ", $v) . " & " . $last : $last, 
    ]; 
} 
+0

@ aman-maurya要素をマージするロジックはありませんか? 1つの状況では、それは1日に、別の時に併合されます。 – Neodan

+0

日が同じで時間も同じ場合はどうすればいいですか?この条件を気にしないでしょうか@AmanMaurya – Confused

+0

@neodan私は重複した時間を取り除き、一つの要素として結合します.. –

答えて

1

4の基本的な手順があります。

  1. が重複行を削除します。
  2. すべての行を1日ごとにソートします(ルックアップを介して)ASC、次に時間を文字列としてASCにします。
  3. 曜日値を一時キーとして使用して、結合された時刻値を格納します。
  4. 結合された時刻値を一時キーとして使用して、結合された曜日値を格納します。

コード:(Demo

$array=[ 
    ['day'=>'Tuesday','time'=>'07:44 pm - 08:44 pm'], 
    ['day'=>'Tuesday','time'=>'04:00 am - 04:25 am'], 
    ['day'=>'Sunday','time'=>'04:00 am - 04:25 am'], 
    ['day'=>'Sunday','time'=>'04:00 am - 04:25 am'], 
    ['day'=>'Friday','time'=>'04:00 am - 04:25 am'], 
    ['day'=>'Friday','time'=>'04:00 am - 04:25 am'] 
]; 

$array=array_unique($array,SORT_REGULAR); // remove exact duplicate rows 

$order=array_flip(['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']); // lookup array 
usort($array,function($a,$b)use($order){ // sort by day name ASC then time ASC 
    if($order[$a['day']]==$order[$b['day']]){ 
     return $a['time']<=>$b['time']; // 2nd sort criteria: time string 
    } 
    return $order[$a['day']]<=>$order[$b['day']]; // 1st sort criteria: day name via lookup array 
}); 

foreach($array as $row){ 
    if(!isset($temp[$row['day']])){ 
     $temp[$row['day']]=$row['time']; // store time for first occurring day 
    }else{ 
     $temp[$row['day']].=" & {$row['time']}"; // join times (for pre-existing day) as they are found 
    } 
} 

foreach($temp as $day=>$times){ 
    if(!isset($result[$times])){ 
     $result[$times]=['day'=>$day,'time'=>$times]; // store first occurring day and time using time as temp key 
    }else{ 
     $result[$times]['day'].=" & $day"; // join day names as they are found 
    } 
} 
var_export(array_values($result)); // optionally remove the temporary keys 

出力:

array (
    0 => 
    array (
    'day' => 'Tuesday', 
    'time' => '04:00 am - 04:25 am & 07:44 pm - 08:44 pm', 
), 
    1 => 
    array (
    'day' => 'Friday & Sunday', 
    'time' => '04:00 am - 04:25 am', 
), 
) 

ここではarray_unique()を呼び出すことはありません別のバージョンがあるが、私は同じくらいそれを好きではありませんsort()が呼び出され、より深い一時配列が生成されるためです。

foreach($array as $row){ 
    $temp[$row['day']][$row['time']]=$row['time']; // remove duplicates and group by day 
} 

$order=array_flip(['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']); // lookup array 
uksort($temp,function($a,$b)use($order){ 
    return $order[$a]<=>$order[$b]; // sort by day name via lookup array 
}); 

foreach($temp as $day=>$times){ 
    sort($times); // sort time elements ASC 
    $time_key=implode(' & ',$times); // join the day's time elements 
    if(!isset($result[$time_key])){ // if first occurrence of the time string 
     $result[$time_key]=['day'=>$day,'time'=>$time_key]; // store data using time string as temp key 
    }else{ 
     $result[$time_key]['day'].=" & {$day}"; // concatenate new day to day element 
    } 
} 

var_export(array_values($result)); 
+0

私はこのコードはPHPバージョン7以上で動作します..しかし、これは問題ではありません.. .thanx @mickmackusa –

+1

はい、宇宙船オペレータは新しいです。私の喜び、これは楽しいものでした。 – mickmackusa

関連する問題