繁体   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