![](/img/trans.png)
[英]How to sort and group datas in a php array where some datas are repeated?
[英]Group similar datas from an array with PHP
這是我的數組:
Array (
[0] => Array (
[NDC_Id] => 56
[NDC_Date] => 2017-04-14
[NDC_Type] => Night
[NDC_Item] => Night
[NDC_Rate] => 95.00
[NDC_Quantity] => 1
[NDC_Taxes] => 0
[NDC_TaxesName] => 0
[NDC_Provenance] => Room
[NDC_ProvenanceRoomId] => 0
[NDC_Status] => NotCharged
)
[1] => Array (
[NDC_Id] => 58
[NDC_Date] => 2017-04-14
[NDC_Type] => Item
[NDC_Item] => Petit déjeuner
[NDC_Rate] => 16.00
[NDC_Quantity] => 2
[NDC_Taxes] => 5.000,9.975
[NDC_TaxesName] => TPS,TVQ
[NDC_Provenance] => Room
[NDC_ProvenanceRoomId] => 0
[NDC_Status] => NotCharged
)
[2] => Array (
[NDC_Id] => 59
[NDC_Date] => 2017-04-14
[NDC_Type] => Item
[NDC_Item] => Lit pour bébé
[NDC_Rate] => 10.00
[NDC_Quantity] => 1
[NDC_Taxes] => 5.000,9.975
[NDC_TaxesName] => TPS,TVQ
[NDC_Provenance] => Room
[NDC_ProvenanceRoomId] => 0
[NDC_Status] => NotCharged
)
[3] => Array (
[NDC_Id] => 57
[NDC_Date] => 2017-04-15
[NDC_Type] => Night
[NDC_Item] => Night
[NDC_Rate] => 95.00
[NDC_Quantity] => 1
[NDC_Taxes] => 0
[NDC_TaxesName] => 0
[NDC_Provenance] => Room
[NDC_ProvenanceRoomId] => 0
[NDC_Status] => NotCharged
)
[4] => Array (
[NDC_Id] => 60
[NDC_Date] => 2017-04-15
[NDC_Type] => Item
[NDC_Item] => Petit déjeuner
[NDC_Rate] => 16.00
[NDC_Quantity] => 2
[NDC_Taxes] => 5.000,9.975
[NDC_TaxesName] => TPS,TVQ
[NDC_Provenance] => Room
[NDC_ProvenanceRoomId] => 0
[NDC_Status] => NotCharged
)
[5] => Array (
[NDC_Id] => 61
[NDC_Date] => 2017-04-15
[NDC_Type] => Item
[NDC_Item] => Lit pour bébé
[NDC_Rate] => 10.00
[NDC_Quantity] => 1
[NDC_Taxes] => 5.000,9.975
[NDC_TaxesName] => TPS,TVQ
[NDC_Provenance] => Room
[NDC_ProvenanceRoomId] => 0
[NDC_Status] => NotCharged
)
)
當某些值相等且日期相同時,我試圖對元素進行分組。
foreach ($array as $item) {
$k = $item['NDC_Type'];
if (!isset($result[$k])) {
$result[$k] = $item;
} elseif (
($i = $result[$k]) &&
$item['NDC_Rate'] === $i['NDC_Rate'] &&
$item['NDC_Item'] === $i['NDC_Item'] &&
$item['NDC_Quantity'] === $i['NDC_Quantity'] &&
$item['NDC_Taxes'] === $i['NDC_Taxes'] &&
$item['NDC_TaxesName'] === $i['NDC_TaxesName'] &&
$item['NDC_Status']=== $i['NDC_Status'] &&
$item['NDC_Provenance'] === $i['NDC_Provenance'] &&
$item['NDC_ProvenanceRoomId'] === $i['NDC_ProvenanceRoomId']
) {
$result[$k]['NDC_Id'] .= ','. $item['NDC_Id'];
$current_dates = explode(',', $result[$k]['NDC_Date']);
$last_date = end($current_dates);
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;
}
} else {
$result[$k. microtime()] = $item;
}
}
$result = array_values($result);
問題是Petit déjeuner
和Night
被分組,但Lit pour bébé
項目卻沒有。
就在這行之前$result = array_values($result);
我對Lit pour bébé
有一個奇怪的關鍵詞。 我有[Item0.69717400 1494009685]
並且兩個Lit pour bébé
[Item0.69717400 1494009685]
的鍵名都不相同。 也許是問題所在?
要回復Sahil Gulati,預期結果應為:
Array (
[0] => Array (
[NDCId] => 56,57
[NDCDate] => 2017-04-14,2017-04-15
[NDCType] => Night
[NDCItem] => Night
[NDCRate] => 95.00
[NDCQuantity] => 1
[NDCTaxes] => 0
[NDCTaxesName] => 0
[NDCProvenance] => Room
[NDCProvenanceRoomId] => 0
[NDCStatus] => NotCharged
)
[1] => Array (
[NDCId] => 58,60
[NDCDate] => 2017-04-14,2017-04-15
[NDCType] => Item
[NDCItem] => Petit déjeuner
[NDCRate] => 16.00
[NDCQuantity] => 2
[NDCTaxes] => 9.975,5.000
[NDCTaxesName] => TVQ,TPS
[NDCProvenance] => Room
[NDCProvenanceRoomId] => 0
[NDCStatus] => NotCharged
)
[2] => Array (
[NDCId] => 59
[NDCDate] => 2017-04-14,2017-04-15
[NDCType] => Item
[NDCItem] => Lit pour bébé
[NDCRate] => 10.00
[NDCQuantity] => 1
[NDCTaxes] => 9.975,5.000
[NDCTaxesName] => TVQ,TPS
[NDCProvenance] => Room
[NDCProvenanceRoomId] => 0
[NDCStatus] => NotCharged
)
)
我在這里使用簡單的foreach
來收集和分組項目
ini_set('display_errors', 1);
$string = '
{
"0" : {
"NDC_Id" :"56",
"NDC_Date" :"2017-04-14",
"NDC_Type" :"Night",
"NDC_Item" :"Night",
"NDC_Rate" :"95.00",
"NDC_Quantity" :"1",
"NDC_Taxes" :"0",
"NDC_TaxesName" :"0",
"NDC_Provenance" :"Room",
"NDC_ProvenanceRoomId" :"0",
"NDC_Status" :"NotCharged"},
"1" : {
"NDC_Id" :"58",
"NDC_Date" :"2017-04-14",
"NDC_Type" :"Item",
"NDC_Item" :"Petit déjeuner",
"NDC_Rate" :"16.00",
"NDC_Quantity" :"2",
"NDC_Taxes" :"5.000,9.975",
"NDC_TaxesName" :"TPS,TVQ",
"NDC_Provenance" :"Room",
"NDC_ProvenanceRoomId" :"0",
"NDC_Status" :"NotCharged"},
"2" : {
"NDC_Id" :"59",
"NDC_Date" :"2017-04-14",
"NDC_Type" :"Item",
"NDC_Item" :"Lit pour bébé",
"NDC_Rate" :"10.00",
"NDC_Quantity" :"1",
"NDC_Taxes" :"5.000,9.975",
"NDC_TaxesName" :"TPS,TVQ",
"NDC_Provenance" :"Room",
"NDC_ProvenanceRoomId" :"0",
"NDC_Status" :"NotCharged"},
"3" : {
"NDC_Id" :"57",
"NDC_Date" :"2017-04-15",
"NDC_Type" :"Night",
"NDC_Item" :"Night",
"NDC_Rate" :"95.00",
"NDC_Quantity" :"1",
"NDC_Taxes" :"0",
"NDC_TaxesName" :"0",
"NDC_Provenance" :"Room",
"NDC_ProvenanceRoomId" :"0",
"NDC_Status" :"NotCharged"},
"4" : {
"NDC_Id" :"60",
"NDC_Date" :"2017-04-15",
"NDC_Type" :"Item",
"NDC_Item" :"Petit déjeuner",
"NDC_Rate" :"16.00",
"NDC_Quantity" :"2",
"NDC_Taxes" :"5.000,9.975",
"NDC_TaxesName" :"TPS,TVQ",
"NDC_Provenance" :"Room",
"NDC_ProvenanceRoomId" :"0",
"NDC_Status" :"NotCharged"},
"5" : {
"NDC_Id" :"61",
"NDC_Date" :"2017-04-15",
"NDC_Type" :"Item",
"NDC_Item" :"Lit pour bébé",
"NDC_Rate" :"10.00",
"NDC_Quantity" :"1",
"NDC_Taxes" :"5.000,9.975",
"NDC_TaxesName" :"TPS,TVQ",
"NDC_Provenance" :"Room",
"NDC_ProvenanceRoomId" :"0",
"NDC_Status" :"NotCharged"}}';
$result = array();
$array = json_decode($string, true);
foreach ($array as $item)
{
if(!isset($result[$item["NDC_Type"].$item["NDC_Item"]]))
{
$result[$item["NDC_Type"].$item["NDC_Item"]]=$item;
}
else
{
$result[$item["NDC_Type"].$item["NDC_Item"]]["NDC_Date"].=",".$item["NDC_Date"];
$result[$item["NDC_Type"].$item["NDC_Item"]]["NDC_Id"].=",".$item["NDC_Id"];
}
}
print_r(array_values($result));
輸出:
Array
(
[0] => Array
(
[NDC_Id] => 56,57
[NDC_Date] => 2017-04-14,2017-04-15
[NDC_Type] => Night
[NDC_Item] => Night
[NDC_Rate] => 95.00
[NDC_Quantity] => 1
[NDC_Taxes] => 0
[NDC_TaxesName] => 0
[NDC_Provenance] => Room
[NDC_ProvenanceRoomId] => 0
[NDC_Status] => NotCharged
)
[1] => Array
(
[NDC_Id] => 58,60
[NDC_Date] => 2017-04-14,2017-04-15
[NDC_Type] => Item
[NDC_Item] => Petit déjeuner
[NDC_Rate] => 16.00
[NDC_Quantity] => 2
[NDC_Taxes] => 5.000,9.975
[NDC_TaxesName] => TPS,TVQ
[NDC_Provenance] => Room
[NDC_ProvenanceRoomId] => 0
[NDC_Status] => NotCharged
)
[2] => Array
(
[NDC_Id] => 59,61
[NDC_Date] => 2017-04-14,2017-04-15
[NDC_Type] => Item
[NDC_Item] => Lit pour bébé
[NDC_Rate] => 10.00
[NDC_Quantity] => 1
[NDC_Taxes] => 5.000,9.975
[NDC_TaxesName] => TPS,TVQ
[NDC_Provenance] => Room
[NDC_ProvenanceRoomId] => 0
[NDC_Status] => NotCharged
)
)
解決方案2: 在此處嘗試此代碼段
從此更改代碼:
$k = $item['NDC_Type'];
這個:
$k = $item['NDC_Type'].$item['NDC_Item'];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.