如果don';不存在于PHP的数组中
我在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
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
已排序,这将保持排序。这也比公认的答案有效得多。