[英]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
。
items
和item 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
)
)
我實際上是在item
和item-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.