如果don';不存在于PHP的数组中

如果don';不存在于PHP的数组中,php,arrays,Php,Arrays,我在PHP中有一个多维数组: Array ( [47] => Array ( [2019-02-24] => Array ( [AVA_Id] => 1 [AVA_Status] => Open ) [2019-02-25] => Array

我在PHP中有一个多维数组:

Array
(
    [47] => Array
        (
            [2019-02-24] => Array
                (
                    [AVA_Id] => 1
                    [AVA_Status] => Open
                )
            [2019-02-25] => Array
                (
                    [AVA_Id] => 3
                    [AVA_Status] => Open
                )
            [2019-02-28] => Array
                (
                    [AVA_Id] => 4
                    [AVA_Status] => Close
                )
        )
    [48] => Array
        (
            [2019-02-26] => Array
                (
                    [AVA_Id] => 2
                    [AVA_Status] => Open
                )
        )
)
对于已知的日期范围,如何用缺失的日期填充此数组

我的日期范围如下:

Array ( [0] => 2019-02-24 [1] => 2019-02-25 [2] => 2019-02-26 [3] => 2019-02-27 [4] => 2019-02-28 [5] => 2019-03-01 [6] => 2019-03-02 )
例如,对于键为
47
的数组,我需要添加缺少的日期:2019-02-26、2019-02-27、2019-03-01和2019-03-02,因为这些日期在日期范围内,但不在键
47
下的数组中。钥匙
48
也是这样

我的尝试是:

foreach($daterange as $date){
    $date = $date->format('Y-m-d');
    if(in_array($myarray[$date]))
        $newarray[$date] = $myarray[$date];
    else
        $newarray[$date] = 0;
}

基本上,您需要循环遍历数组中的每个元素,然后检查每个日期是否作为键存在于数组中。如果不是,我们将为该日期添加一个“空白”元素:

foreach ($array as &$arr) {
    foreach ($dates as $date) {
        if (!in_array($date, array_keys($arr))) {
            $arr[$date] = array('AVA_Id' => 0, 'AVA_Status' => 'no');
        }
    }
}
print_r($array);
输出相当长,因此我省略了它,但您可以在下面的示例中看到它

要按日期对数组键进行排序,只需在循环中添加一个
ksort

foreach ($array as &$arr) {
    foreach ($dates as $date) {
        if (!in_array($date, array_keys($arr))) {
            $arr[$date] = array('AVA_Id' => 0, 'AVA_Status' => 'no');
        }
    }
    ksort($arr);
}

更新

正如@trincot在评论中指出的那样,使用
isset
而不是在数组中
可以更有效地编写上述内容:

foreach ($array as &$arr) {
    foreach ($dates as $date) {
        $arr[$date] = isset($arr[$date]) ? $arr[$date] : array('AVA_Id' => 0, 'AVA_Status' => 'no');
    }
    ksort($arr);
}

或使用PHP7中的空合并运算符
??

foreach ($array as &$arr) {
    foreach ($dates as $date) {
        $arr[$date] = $arr[$date] ?? array('AVA_Id' => 0, 'AVA_Status' => 'no');
    }
    ksort($arr);
}

更新2

通过在循环中使用临时数组,可以使代码更加高效,这样就不需要
ksort

foreach ($array as &$arr) {
    foreach ($dates as $date) {
        $out[$date] = $arr[$date] ?? array('AVA_Id' => 0, 'AVA_Status' => 'no');
    }
    $arr = $out;
}

注意

正如@dWinder所指出的,您可以在
$dates
数组和每个数组元素的键之间使用
array_diff
,以查找所需的新条目:

foreach ($array as &$arr) {
    foreach (array_diff($dates, array_keys($arr)) as $date) {
        $arr[$date] = array('AVA_Id' => 0, 'AVA_Status' => 'no');
    }
    ksort($arr);
}

为什么不从日期范围的空白数组开始,然后将实际元素复制到此数组中呢

$template = array_fill_keys($daterange,['AVA_Id' => 0,'AVA_Status' => 'No']);

foreach ($outer as $ind => $dates) {

   $output[$ind] = $template;

   foreach ($dates as $d => $v) {

       $output[$ind][$d] = $v;

   }

 }

要为丢失的日期添加哪些值(
AVA\u Id
AVA\u Status
),还是只需要一个空数组?Hello@Nick,
AVA\u Id
可以是
0
,而
AVA\u Status
可以是
。谢谢你的帮助。不要使用
数组中的
而使用
isset
。我更喜欢使用
array\u diff
来获取set@dWinder好主意!如果你不打算把它作为一个答案,我会把它包括在我的答案中?继续吧-你的答案很好-我更喜欢一个很好的答案,然后是三个单独的答案。再加上
ksort
@dWinder我在ksort上比你领先14秒!:-)@卢夫克表示同意。不过,公平地说,没有必要进行排序,因为它只会使数据更美观,便于显示。任何通过给定日期索引访问数组元素的尝试都将起作用,无论键是否已排序。@PacPac如果您有一个大数据集,将值得将此答案与我的答案进行基准测试,您可能会发现它更快。您好lufc,我需要使用ksort()吗函数对日期进行排序ASC?不,您不需要进行排序,因为您的
$daterange
已排序,这将保持排序。这也比公认的答案有效得多。