Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中,在多维数组中合并依赖于键值的数组_Php_Arrays - Fatal编程技术网

在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

我在PHP中使用了这种类型的数组:

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不知道为什么要删除?你的答案可以说是解决这个问题的更好办法。。。