在PHP中,在多维数组中合并依赖于键值的数组
我在PHP中使用了这种类型的数组:在PHP中,在多维数组中合并依赖于键值的数组,php,arrays,Php,Arrays,我在PHP中使用了这种类型的数组: Array( [100] => Array( [1] => Array ( [AVA_Date] => 2019-04-18 [ROO_Id] => 100 [RAT_Id] => 9 ) [2] => Array ( [AVA_Date
Array(
[100] => Array(
[1] => Array (
[AVA_Date] => 2019-04-18
[ROO_Id] => 100
[RAT_Id] => 9
)
[2] => Array (
[AVA_Date] => 2019-04-20
[ROO_Id] => 100
[RAT_Id] => 10
)
[4] => Array (
[AVA_Date] => 2019-04-21
[ROO_Id] => 100
[RAT_Id] => 10
)
[7] => Array (
[AVA_Date] => 2019-04-22
[ROO_Id] => 100
[RAT_Id] => 9
)
)
)
仅当ROO\u Id
和RAT\u Id
相等时,我才希望合并此数组中的项
然后,对于AVA_Date
,我需要在当前数组中的新数组下列出它们
因此,期望的输出是:
Array(
[100] => Array(
[1] => Array (
[AVA_Date] => Array (
[0] => 2019-04-18
[1] => 2019-04-22
)
[ROO_Id] => 100
[RAT_Id] => 9
)
[2] => Array (
[AVA_Date] => Array (
[0] => 2019-04-20
[1] => 2019-04-21
)
[ROO_Id] => 100
[RAT_Id] => 10
)
)
)
以下是我的尝试:
$newArrOtherRooms = array_reduce($newArr, function($acc, $val) {
$room = array_search($val['ROO_Id'], array_column($acc, 'ROO_Id'));
$rate = array_search($val['RAT_Id'], array_column($acc, 'RAT_Id'));
if($rate == $room && $room > -1) {
array_push($acc[$room]['AVA_Date'], $val['AVA_Date']);
}
else {
$new_arr = $val;
$new_arr['AVA_Date'] = [$val['AVA_Date']];
array_push($acc, $new_arr);
}
return $acc;
},[]);
但它不像我想要的那样工作
请问我这里缺什么
谢谢您的帮助。您的代码有几个问题。首先,您需要在
$newArr
的外部级别上使用foreach
包装。其次,您的调用不考虑一个事实,即“代码> ROOYIDID <代码>或<代码> RATSIDID<代码>值可能不止一次存在于数组中,因为它只返回找到值的第一个键。要解决此问题,可以使用为每个ROO\u Id
和RAT\u Id
值获取键值数组,然后使用获取这两个数组的交点,以查看它们是否都存在于同一元素中。如果是,则更新该元素,否则创建一个新元素:
foreach ($newArr as $key => $array) {
$newArrOtherRooms[$key] = array_reduce($array, function($acc, $val) {
$room = array_keys(array_column($acc, 'ROO_Id'), $val['ROO_Id']);
$rate = array_keys(array_column($acc, 'RAT_Id'), $val['RAT_Id']);
$common = array_intersect($room, $rate);
if(!empty($common)) {
array_push($acc[current($common)]['AVA_Date'], $val['AVA_Date']);
}
else {
$new_arr = $val;
$new_arr['AVA_Date'] = [$val['AVA_Date']];
array_push($acc, $new_arr);
}
return $acc;
},[]);
}
print_r($newArrOtherRooms);
输出:
Array(
[100] => Array(
[0] => Array (
[AVA_Date] => Array (
[0] => 2019-04-18
[1] => 2019-04-22
)
[ROO_Id] => 100
[RAT_Id] => 9
)
[1] => Array (
[AVA_Date] => Array (
[0] => 2019-04-20
[1] => 2019-04-21
)
[ROO_Id] => 100
[RAT_Id] => 10
)
)
)
@dWinder不知道为什么要删除?你的答案可以说是解决这个问题的更好办法。。。