簡體   English   中英

在PHP中過濾多維數組

[英]Filter a multidimentional array in PHP

我有一個PHP數組,如下所示:

Array(
    0 => Array(
        'NDC_Date'     => '2017-02-26',
        'NDC_Item'     => 'Night',
        'NDC_Rate'     => 108.00,
        'NDC_Quantity' => 1,
    ),
    1 => Array(
        'NDC_Date'     => '2017-02-27',
        'NDC_Item'     => 'Night',
        'NDC_Rate'     => 108.00,
        'NDC_Quantity' => 1,
    ),
    2 => Array(
        'NDC_Date'     => '2017-02-28',
        'NDC_Item'     => 'Night',
        'NDC_Rate'     => 118.00,
        'NDC_Quantity' => 1,
    ),
    3 => Array(
        'NDC_Date'     => '2017-03-01',
        'NDC_Item'     => 'Night',
        'NDC_Rate'     => 108.00,
        'NDC_Quantity' => 1,
    ),
    4 => Array(
        'NDC_Date'     => '2017-01-01',
        'NDC_Item'     => 'Breakfast',
        'NDC_Rate'     => 12.00,
        'NDC_Quantity' => 2,
    ),
    5 => Array(
        'NDC_Date'     => '2017-01-01',
        'NDC_Item'     => 'Extra bed',
        'NDC_Rate'     => 0.00,
        'NDC_Quantity' => 1,
    ),
    6 => Array(
        'NDC_Date'     => '2017-01-02',
        'NDC_Item'     => 'Breakfast',
        'NDC_Rate'     => 12.00,
        'NDC_Quantity' => 2,
    ),
    7 => Array(
        'NDC_Date'     => '2017-01-02',
        'NDC_Item'     => 'Extra bed',
        'NDC_Rate'     => 0.00,
        'NDC_Quantity' => 1,
    ),
    8 => Array(
        'NDC_Date'     => '2017-01-03',
        'NDC_Item'     => 'Breakfast',
        'NDC_Rate'     => 12.00,
        'NDC_Quantity' => 2,
    ),
    9 => Array(
        'NDC_Date'     => '2017-01-03',
        'NDC_Item'     => 'Extra bed',
        'NDC_Rate'     => 0.00,
        'NDC_Quantity' => 1,
    ),
);

我需要合並一些條目only當:

  • 日期是consecutive

  • itemsitem rates是相同的。


期望的輸出:

Array (
    [0] => Array (
        [NDC_Date] => 2017-02-26, 2017-02-27
        [NDC_Item] => Night
        [NDC_Rate] => 108.00
        [NDC_Quantity] => 1
    )
    [1] => Array (
        [NDC_Date] => 2017-02-28
        [NDC_Item] => Night
        [NDC_Rate] => 118.00
        [NDC_Quantity] => 1
    )
    [2] => Array (
        [NDC_Date] => 2017-03-01
        [NDC_Item] => Night
        [NDC_Rate] => 108.00
        [NDC_Quantity] => 1
    )
    [3] => Array (
        [NDC_Date] => 2017-01-01, 2017-01-02, 2017-01-03
        [NDC_Item] => Breakfast
        [NDC_Rate] => 12.00
        [NDC_Quantity] => 2
    )
    [4] => Array (
        [NDC_Date] => 2017-01-01, 2017-01-02, 2017-01-03
        [NDC_Item] => Extra bed
        [NDC_Rate] => 0.00
        [NDC_Quantity] => 1
    )
)

我實際上是在itemitem-price相同時合並日期的代碼段:

$result = [];
foreach ($billingDatas as $item) {
    $k = $item['NDC_Item'];
    if (!isset($result[$k])) {
        $result[$k] = $item;
    } elseif (($i = $result[$k]) 
            && $item['NDC_Rate'] == $i['NDC_Rate'] 
            && $item['NDC_Quantity'] == $i['NDC_Quantity']) {
        $result[$k]['NDC_Date'] .= ', '. $item['NDC_Date'];
    } else {
        $result[$k. time()] = $item;
    }
}
$result = array_values($result);

另一個檢查日期是否連續:

$dates = "2017-02-26, 2017-02-27, 2017-03-01";
$dates = explode(',', $dates);

$conseq = array(); 
$ii = 0;
$max = count($dates);

for($i = 0; $i < count($dates); $i++) {
    $conseq[$ii][] = date('Y-m-d',strtotime($dates[$i]));

    if($i + 1 < $max) {
        $dif = strtotime($dates[$i + 1]) - strtotime($dates[$i]);
        if($dif >= 90000) {
            $ii++;
        }   
    }
}

print_r($conseq);

但是如何合並這兩個代碼來獲得新數組呢?

謝謝。

不要使用第二種方法來剖析每個部分,你所做的只是建立你最初的foreach循環中已有的東西。

當前循環中的第一個標准是檢查速率,然后檢查數量。 下一步是檢查日期

為此,獲取當前批處理分組數組,將其展開並獲取最后日期。 並檢查當前的迭代日期並檢查該日期是否是連續的一天。

理念:

$result = [];
foreach ($billingDatas as $item) {
    $k = $item['NDC_Item'];

    if (!isset($result[$k])) {
        $result[$k] = $item;
    } elseif (
        ($i = $result[$k]) && 
        $item['NDC_Rate'] === $i['NDC_Rate'] && 
        $item['NDC_Quantity'] === $i['NDC_Quantity'] 
    ) {
        // additional date check
        $current_dates = explode(', ', $result[$k]['NDC_Date']); // get the comma delimited dates and explode
        $last_date = end($current_dates); // get the last date
        // then check if the current iteration date is the next day
        if(date('Y-m-d', strtotime("{$last_date} +1 day")) === $item['NDC_Date']) {
            $result[$k]['NDC_Date'] .= ', '. $item['NDC_Date'];
        } else {
            $result[$k. microtime()] = $item;
        }
        // rest is self-explanatory

    } else {
        $result[$k. microtime()] = $item;
    }
}
$result = array_values($result);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM