2017-01-10 125 views
1

我在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); 

And anot她的一个检查日期是连续的还是不:

$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); 

但我怎么能合并这两个代码来获得新的阵列?

谢谢。

+0

为什么你删除同一昨天问了,请问今天同一个??? –

+0

因为我现在有了检查连续日期的代码。 –

+0

在这种情况下,你应该是旧的。不重新打开一个。 –

回答

0

不要使用解剖每个部分的第二种方法,你所做的只是建立在你最初的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); 
+0

哇。我想你对此有很大的帮助。谢谢你的解释和你的时间。 –

+0

@ user7347588当然很高兴这有帮助 – Ghost