使用PHP对数组中的类似数据进行分组

使用PHP对数组中的类似数据进行分组,php,arrays,Php,Arrays,这里是我的阵列: 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] =>

这里是我的阵列:

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
是分组的,而不是
light pour bébé

就在这行前面
$result=array\u value($result)
我有一个奇怪的
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
    )
)

这里我使用simple
foreach
来收集和分组项目

输出:

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
        )

)
$k = $item['NDC_Type'];
$k = $item['NDC_Type'].$item['NDC_Item'];
解决方案2:

从此处更改代码:

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
        )

)
$k = $item['NDC_Type'];
$k = $item['NDC_Type'].$item['NDC_Item'];
这个:

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
        )

)
$k = $item['NDC_Type'];
$k = $item['NDC_Type'].$item['NDC_Item'];

您可以分享您的预期输出吗?当我运行代码时,在
$result=array\u values($result)之前的某一时刻,键更改为
[Item0.69717400 14940009685]
@SahilGulati,添加了预期结果。我希望我的帖子能帮助你。谢谢你的帮助。我的初始代码有什么问题?为什么需要创建新代码?您的实际代码的问题在于,如果它的项目在连续一天内被预订,它就不会在意。@qatari尝试我的第二种解决方案您的代码的问题是分组。。试试这个@qatari错误是因为
NDC_类型
item
4次,所以添加一个microtime使其成为一个新的组,所以你应该根据
NDC_项目
NDC_类型
对结果数组进行分组@qatari我正在研究它,但我仍然怀疑你的代码是否被卡住了。我的
1st
解决方案可以正常工作。但是你可以随便挑一个。再次检查您的代码。@qatari很抱歉,您当前的登录甚至不能分组
NDC_项目
NDC_类型
,对于这个特定的示例,它可以工作,但在值因为您的逻辑而被洗牌的情况下,它不会工作
如果(日期('Y-m-d',strotime({$last_date}+1天))==$Item['NDC_日期])
,我的建议是只将
NDC\U项目
NDC\U类型
分组,并继续添加
id
日期