使用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
)
)
这里我使用simpleforeach
来收集和分组项目
输出:
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
和日期
。