首页 > 解决方案 > 用 prev 值填充空数组点

问题描述

我正在使用PHP 7.3.5.

我有一个带有空点的数组,我想填充上一个点的值:

例如:

    0 => 'FriAug 1',
    1 => '',
    2 => '',
    3 => '',
    4 => '',

应该导致:

0 => '01.08.2019',
1 => '01.08.2019',
2 => '01.08.2019',
3 => '01.08.2019',
4 => '01.08.2019',

我尝试了以下方法:

<?php

$arr = array (
    0 => 'FriAug 1',
    1 => '',
    2 => '',
    3 => '',
    4 => '',
    5 => '',
    6 => '',
    7 => '',
    8 => '',
    9 => '',
    10 => '',
    11 => '',
    12 => '',
    13 => '',
    14 => '',
    15 => '',
    16 => '',
    17 => '',
    18 => '',
    19 => 'SatNov 2',
    20 => 'SunNov 3',
    21 => '',
    22 => '',
    23 => '',
    24 => '',
    25 => '',
    26 => 'MonJan 4',
    27 => '',
    28 => '',
    29 => '',
    30 => '',
    31 => '',
    32 => '',
    33 => '',
    34 => '',
    35 => '',
    36 => '',
    37 => '',
    38 => '',
    39 => '',
    40 => '',
    41 => '',
    42 => '',
    43 => '',
    44 => '',
    45 => 'TueDec 5',
    46 => '',
    47 => '',
    48 => '',
    49 => '',
    50 => '',
    51 => '',
    52 => '',
    53 => '',
    54 => '',
    55 => '',
    56 => '',
    57 => '',
    58 => '',
    59 => '',
    60 => '',
    61 => '',
    62 => 'WedNov 6'
);

$resArr = array();
foreach ($arr as $key => $v) {
    $prev = $key - 1;
    if($arr[$key] === '') {
        array_push($resArr, strtotime(preg_replace("^.{0,3}","", $arr[$prev])));
    } else {
        array_push($resArr, strtotime(preg_replace("^.{0,3}","", $arr[$key])));
    }
}

print_r($resArr);

我的最终结果应如下所示:

// Wanted Result:
0 => '01.08.2019',
1 => '01.08.2019',
2 => '01.08.2019',
3 => '01.08.2019',
4 => '01.08.2019',
5 => '01.08.2019',
6 => '01.08.2019',
7 => '01.08.2019',
8 => '01.08.2019',
9 => '01.08.2019',
10 => '01.08.2019',
11 => '01.08.2019',
12 => '01.08.2019',
13 => '01.08.2019',
14 => '01.08.2019',
15 => '01.08.2019',
16 => '01.08.2019',
17 => '01.08.2019',
18 => '01.08.2019',
19 => '02.11.2019',
20 => '03.11.2019',
21 => '03.11.2019',
22 => '03.11.2019',
23 => '03.11.2019',
24 => '03.11.2019',
25 => '03.11.2019',
26 => '04.11.2019',
27 => '04.11.2019',
28 => '04.11.2019',
29 => '04.11.2019',
30 => '04.11.2019',
31 => '04.11.2019',
32 => '04.11.2019',
33 => '04.11.2019',
34 => '04.11.2019',
35 => '04.11.2019',
36 => '04.11.2019',
37 => '04.11.2019',
38 => '04.11.2019',
39 => '04.11.2019',
40 => '04.11.2019',
41 => '04.11.2019',
42 => '04.11.2019',
43 => '04.11.2019',
44 => '04.11.2019',
45 => '05.12.2019',
46 => '05.12.2019',
47 => '05.12.2019',
48 => '05.12.2019',
49 => '05.12.2019',
50 => '05.12.2019',
51 => '05.12.2019',
52 => '05.12.2019',
53 => '05.12.2019',
54 => '05.12.2019',
55 => '05.12.2019',
56 => '05.12.2019',
57 => '05.12.2019',
58 => '05.12.2019',
59 => '05.12.2019',
60 => '05.12.2019',
61 => '05.12.2019',
62 => '06.11.2019'
);

但是,我只null/false在最终输出中获得值。

有什么建议我做错了吗?

感谢您的回复!

标签: phparrays

解决方案


问题之一是使用正则表达式 - 您的模式不正确 - 但由于它只是删除前面的 3 个字符,因此更容易substr()删除它们。

第二部分是你只看源数组中的前一个数组位置——它也可能是空白的。此版本仅存储生成的最后一个值(在 中$prev)并在需要时继续使用它...

$resArr = array();
$prev = "";
foreach ($arr as $key => $v) {
    if($arr[$key] === '') {
        array_push($resArr, $prev);
    } else {
        $prev = date("d.m.Y",strtotime(substr($arr[$key], 3)));
        array_push($resArr, $prev);
    }
} 

这可以在不失去太多清晰度的情况下简化...

$resArr = array();
$prev = "";
foreach ($arr as $key => $v) {
    if($arr[$key] !== '') {
        $prev = date("d.m.Y",strtotime(substr($arr[$key], 3)));
    }
    array_push($resArr, $prev);
}

推荐阅读