2016-12-24 86 views
2

我試圖寫程序的計算接下來20日期指定開始日期後,再從20日我有不包括週末& Holidays(Array holidays('2016-12-13',2016-12-24))和傳球假日array(Eg:- holidays('2016-12-13',2016-12-24)))後結果數組只包括工作日不包括星期六&週日,從這個結果數組,它必須從結果數組中排除。 I:E;如何從數組中刪除重複的元素後與PHP中的另一個數組合並?

我想預期的輸出下面提到

Array ([2016-12-01] => [2016-12-02] => [2016-12-05] => [2016-12-06] => [2016-12-07] => [2016-12-08] => [2016-12-09] => [2016-12-12] => [2016-12-13] => [2016-12-14] => [2016-12-15] => [2016-12-16] => [2016-12-19] => [2016-12-20] => [2016-12-21] => [2016-12-22] => [2016-12-23] => [0] => 2016-12-13 [1] => 2016-12-24)

>但我想預期的輸出: - - :

<?php 
$Date=array('2016-12-01'); 
echo "\n <br />Start Date:-" . $Date[0] . ""; 

          /*Code For Generating Next 20 Dates Starts*/ 
//$start = strtotime($s_row['schedule_start_date']); 

$start = strtotime('2016-12-01'); 
$dates=array(); 
for($i = 0; $i<20; $i++) 
{ 
    array_push($dates,date('Y-m-d', strtotime("+$i day", $start))); 
} 
echo "\n <br /> Array Of next 20 Days/dates of Given:-"; 
print_r($dates); 

$start=array(); 
$start=$dates;       /*Code For Generating Next 20 Dates Ends*/ 
$result=array(); 

$start = strtotime(array_values($Date)[0]); 
//$end = strtotime(array_values($Date)[30]); 
$result = array(); 
$begin = new DateTime('2016-12-01'); 
$end = new DateTime(''); 
//$end = $end->modify('+1 day'); 

$interval = new DateInterval('P1D'); 
$daterange = new DatePeriod($begin, $interval ,$end); 

foreach($daterange as $date) 
{ 
    //echo $date->format("Y-m-d") . "<br>"; 
    if (date('N', $start) <= 5)  /* 'N' number days 1 (mon) to 7 (sun) */ 
            /*5 weekday */ 
    { 
     $current = date('Y-m-d', $start);  //m/d/Y 
     $result[$current] = ''; 

    } 
    $start += 86400; 
    //echo "Days Without Sat Sun".$result[date($date->format("Y-m-d"))]; 
     //echo "Days Without Sat Sun".$result2[date($current->format("Y-m-d"))]; 

} 
echo " \n <br /> Dates Without Weekends LIKE (Excluding Saturday & Sunday):-"; 
print_r($result); 



     /*For Holiday*/ 
$FinalArray = array();   
$holidays = array(
    '2016-12-13', 
    '2016-12-24', 
); 
echo " \n <br /> Given Holiday Dates Are:-"; 
print_r($holidays); 



$a1 = $result; 
$a2 = $holidays; 
$array = array_diff(array_merge($a1,$a2),array_intersect($a1,$a2)); 

echo "\n <br /> Output:-"; 
print_r($array); 

?> 

,因爲它使輸出

Array ([2016-12-01] => [2016-12-02] => [2016-12-05] => [2016-12-06] => [2016-12-07] => [2016-12-08] => [2016-12-09] => [2016-12-12] => [2016-12-14] => [2016-12-15] => [2016-12-16] => [2016-12-19] => [2016-12-20] => [2016-12-21] => [2016-12-22] => [2016-12-23] 

你可以看到,2016-12-13是不存在以上的預期輸出爲在'2016-12-13',2016-12-24通過節假日數組($holidays = array('2016-12-13', '2016-12-24',);) i:e;如果我通過任何節假日排列數組它不應該包含在結果Array(). i:e 2016-12-13是可用的結果數組以及假日數組所以雖然打印最終輸出: -13th date(2016-12-13)不應包含在最終輸出。任何人解決這個問題都將被提前感謝。

+1

儘管使用內置的PHP數組函數,解決方案以任何其他方式使用foreach循環或任何函數將讚賞 –

+0

array_unique()函數可以幫助你 – Gulshan

回答

1

當我從一個陣列中刪除重複,我繼續回去是

array array_unique (array $array [, int $sort_flags = SORT_STRING ]) 

的功能,你可以找到的文檔Here

<?php 
    $input = array("a" => "green", "red", "b" => "green", "blue", "red"); 
    $result = array_unique($input); 
    print_r($result); 
?> 

輸出

Array 
(
    [a] => green 
    [0] => red 
    [1] => blue 
) 

我希望這能夠幫助

0

我更喜歡一次只計算所有日期。 (如果它們也不用於輸出,您可以跳過填充$dates$dates_mon_fri陣列。)還有另一種方法可以避免array_diff()array_unique()函數。我已使用array_flip()$holdidays陣列中的值交換密鑰以使用快速array_key_exists()函數。

<?php 

$start = strtotime('2016-12-01'); 

$holidays = [ 
    '2016-12-13', 
    '2016-12-24', 
]; 

$dates = []; 
$dates_mon_fri = []; 
$dates_working = []; 
$flip_holidays = array_flip($holidays); 

for ($i = 0; $i < 20; $i++) { 
    $timestamp = strtotime("+$i day", $start); 
    $date = date('Y-m-d', $timestamp); 

    $dates[] = $date; 

    $mon_fri = false; 
    if (date('N', $timestamp) <= 5) { 
     $dates_mon_fri[] = $date; 
     $mon_fri = true; 
    } 

    if ($mon_fri && !array_key_exists($date, $flip_holidays)) { 
     $dates_working[] = $date; 
    } 
} 

var_dump($dates); 
var_dump($dates_mon_fri); 
var_dump($dates_working); 
0

可避免使用顯式的循環:

$begin = new DateTimeImmutable('2016-12-01'); 
$end = $begin->modify('+20 days'); 

$interval = new DateInterval('P1D'); 
$daterange = new DatePeriod($begin, $interval, $end); 

$allDates = iterator_to_array($daterange); 
$datesExcludingWeekends = array_filter($allDates, function ($date) { 
    return (int) $date->format("N") < 6; 
}); 
$datesExcludingWeekends = array_map(
    'date_format', 
    $datesExcludingWeekends, 
    array_fill(1, count($datesExcludingWeekends), 'Y-m-d') 
); 

$holidays = [ 
    '2016-12-13', 
    '2016-12-24', 
]; 

$datesExcludingWeekendsIncludingHolidays = array_flip(array_merge(
    $datesExcludingWeekends, 
    array_diff($holidays, $datesExcludingWeekends) 
)); 

這裏是working demo。另外,請看Carbon library。如果你需要一些詳盡的日期,這個圖書館可以真正減輕你的生活。

相關問題