簡體   English   中英

使用PHP將數組中的相似數據分組

[英]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éjeunerNight被分組,但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.

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