如果Key中的Date与其他数组的日期范围匹配,则更改PHP数组中的键名称

时间:2014-12-17 02:36:49

标签: php arrays date

我知道在更改数组中的键之前已经问过这个问题, 但是如果密钥中的日期与日期范围相匹配,我想要的是那个密钥应该被替换。

E-克 我有一个数组,其中包含从第1天到第31天的整个月的按键

[Project 456] => Array
    (
        [2014-12-01] => 5
        [2014-12-02] => 00
        [2014-12-03] => 00
        [2014-12-04] => 00
        [2014-12-05] => 00
        [2014-12-06] => 00
        [2014-12-07] => 00
        [2014-12-08] => 00
        [2014-12-09] => 00
        [2014-12-10] => 8
        [2014-12-11] => 00
        [2014-12-12] => 00
        [2014-12-13] => 00
        [2014-12-14] => 00
        [2014-12-15] => 00
        [2014-12-16] => 00
        [2014-12-17] => 00
        [2014-12-18] => 00
        [2014-12-19] => 00
        [2014-12-20] => 00
        [2014-12-21] => 00
        [2014-12-22] => 00
        [2014-12-23] => 00
        [2014-12-24] => 00
        [2014-12-25] => 00
        [2014-12-26] => 00
        [2014-12-27] => 00
        [2014-12-28] => 00
        [2014-12-29] => 00
        [2014-12-30] => 00
        [2014-12-31] => 00
        [Total] => 13
    )

我希望日期与其他数组的日期范围相匹配

Array
(
    [0] => stdClass Object
        (
            [AvailableLeaveTypes] => Sick
            [TotalAllocatedLeaves] => 6
            [TotalLeavesTaken] => 3
            [Balance] => 3
            [LeaveFrom] => 2014-12-05
            [LeaveTo] => 2014-12-08
        )
)

然后具有匹配日期的第一个数组的键应替换为LeaveType,即Sick

我必须遵循哪种方法?

== - == - == - == - == - == - == - == - ==

更新

First Array实际上是MultiDimentional Array。

这是完整的数组

Array
(
    [Date] => Array
        (
            [0] => 01
            [1] => 02
            [2] => 03
            [3] => 04
            [4] => 05
            [5] => 06
            [6] => 07
            [7] => 08
            [8] => 09
            [9] => 10
            [10] => 11
            [11] => 12
            [12] => 13
            [13] => 14
            [14] => 15
            [15] => 16
            [16] => 17
            [17] => 18
            [18] => 19
            [19] => 20
            [20] => 21
            [21] => 22
            [22] => 23
            [23] => 24
            [24] => 25
            [25] => 26
            [26] => 27
            [27] => 28
            [28] => 29
            [29] => 30
            [30] => 31
            [Total] => Total Hours Worked
        )

    [Day] => Array
        (
            [0] => Monday
            [1] => Tuesday
            [2] => Wednesday
            [3] => Thursday
            [4] => Friday
            [5] => Saturday
            [6] => Sunday
            [7] => Monday
            [8] => Tuesday
            [9] => Wednesday
            [10] => Thursday
            [11] => Friday
            [12] => Saturday
            [13] => Sunday
            [14] => Monday
            [15] => Tuesday
            [16] => Wednesday
            [17] => Thursday
            [18] => Friday
            [19] => Saturday
            [20] => Sunday
            [21] => Monday
            [22] => Tuesday
            [23] => Wednesday
            [24] => Thursday
            [25] => Friday
            [26] => Saturday
            [27] => Sunday
            [28] => Monday
            [29] => Tuesday
            [30] => Wednesday
        )

    [Project 456] => Array
        (
            [2014-12-01] => 5
            [2014-12-02] => 00
            [2014-12-03] => 00
            [2014-12-04] => 00
            [2014-12-05] => 00
            [2014-12-06] => 00
            [2014-12-07] => 00
            [2014-12-08] => 00
            [2014-12-09] => 00
            [2014-12-10] => 8
            [2014-12-11] => 00
            [2014-12-12] => 00
            [2014-12-13] => 00
            [2014-12-14] => 00
            [2014-12-15] => 00
            [2014-12-16] => 00
            [2014-12-17] => 00
            [2014-12-18] => 00
            [2014-12-19] => 00
            [2014-12-20] => 00
            [2014-12-21] => 00
            [2014-12-22] => 00
            [2014-12-23] => 00
            [2014-12-24] => 00
            [2014-12-25] => 00
            [2014-12-26] => 00
            [2014-12-27] => 00
            [2014-12-28] => 00
            [2014-12-29] => 00
            [2014-12-30] => 00
            [2014-12-31] => 00
            [Total] => 13
        )
)

我想如果我可以使用IF语句,如果Top Arrays Keys不是Day和Date那么可以匹配内部日期。所以比较两个数组的可能结果就是。

Array
(
    [Date] => Array
        (
            [0] => 01
            [1] => 02
            [2] => 03
            [3] => 04
            [4] => 05
            [5] => 06
            [6] => 07
            [7] => 08
            [8] => 09
            [9] => 10
            [10] => 11
            [11] => 12
            [12] => 13
            [13] => 14
            [14] => 15
            [15] => 16
            [16] => 17
            [17] => 18
            [18] => 19
            [19] => 20
            [20] => 21
            [21] => 22
            [22] => 23
            [23] => 24
            [24] => 25
            [25] => 26
            [26] => 27
            [27] => 28
            [28] => 29
            [29] => 30
            [30] => 31
            [Total] => Total Hours Worked
        )

    [Day] => Array
        (
            [0] => Monday
            [1] => Tuesday
            [2] => Wednesday
            [3] => Thursday
            [4] => Friday
            [5] => Saturday
            [6] => Sunday
            [7] => Monday
            [8] => Tuesday
            [9] => Wednesday
            [10] => Thursday
            [11] => Friday
            [12] => Saturday
            [13] => Sunday
            [14] => Monday
            [15] => Tuesday
            [16] => Wednesday
            [17] => Thursday
            [18] => Friday
            [19] => Saturday
            [20] => Sunday
            [21] => Monday
            [22] => Tuesday
            [23] => Wednesday
            [24] => Thursday
            [25] => Friday
            [26] => Saturday
            [27] => Sunday
            [28] => Monday
            [29] => Tuesday
            [30] => Wednesday
        )

    [Project 456] => Array
        (
            [2014-12-01] => 5
            [2014-12-02] => 00
            [2014-12-03] => 00
            [2014-12-04] => 00
            [2014-12-05-Sick] => 00
            [2014-12-06-Sick] => 00
            [2014-12-07-Sick] => 00
            [2014-12-08-Sick] => 00
            [2014-12-09] => 00
            [2014-12-10] => 8
            [2014-12-11] => 00
            [2014-12-12] => 00
            [2014-12-13] => 00
            [2014-12-14] => 00
            [2014-12-15] => 00
            [2014-12-16] => 00
            [2014-12-17] => 00
            [2014-12-18] => 00
            [2014-12-19] => 00
            [2014-12-20] => 00
            [2014-12-21] => 00
            [2014-12-22] => 00
            [2014-12-23] => 00
            [2014-12-24] => 00
            [2014-12-25] => 00
            [2014-12-26] => 00
            [2014-12-27] => 00
            [2014-12-28] => 00
            [2014-12-29] => 00
            [2014-12-30] => 00
            [2014-12-31] => 00
            [Total] => 13
        )
)

但我不想打扰它所处的顺序。只想改变键。

这是另一个完整数组,但其中只有一个拥有日期范围的数据。

Array
(
    [0] => stdClass Object
        (
            [AvailableLeaveTypes] => Sick
            [TotalAllocatedLeaves] => 6
            [TotalLeavesTaken] => 3
            [Balance] => 3
            [LeaveFrom] => 2014-12-05
            [LeaveTo] => 2014-12-08
        )

    [1] => stdClass Object
        (
            [AvailableLeaveTypes] => On Leave
            [TotalAllocatedLeaves] => 0
            [TotalLeavesTaken] => 0
            [Balance] => 0
            [LeaveFrom] => 
            [LeaveTo] => 
        )

    [2] => stdClass Object
        (
            [AvailableLeaveTypes] => Earned Leave
            [TotalAllocatedLeaves] => 0
            [TotalLeavesTaken] => 0
            [Balance] => 0
            [LeaveFrom] => 
            [LeaveTo] => 
        )

    [3] => stdClass Object
        (
            [AvailableLeaveTypes] => Casual
            [TotalAllocatedLeaves] => 0
            [TotalLeavesTaken] => 0
            [Balance] => 0
            [LeaveFrom] => 
            [LeaveTo] => 
        )

    [4] => stdClass Object
        (
            [AvailableLeaveTypes] => Annual
            [TotalAllocatedLeaves] => 0
            [TotalLeavesTaken] => 0
            [Balance] => 0
            [LeaveFrom] => 
            [LeaveTo] => 
        )

    [5] => stdClass Object
        (
            [AvailableLeaveTypes] => Unpaid
            [TotalAllocatedLeaves] => 0
            [TotalLeavesTaken] => 0
            [Balance] => 0
            [LeaveFrom] => 
            [LeaveTo] => 
        )

)

因此,如果LeaveFromLeaveTo为空,则不会为其更新第一个数组。只适用于那些有来自/到日期的人。

1 个答案:

答案 0 :(得分:1)

你可以使用一个简单的foreach循环。首先,使用离开的空闲对象清理假数组,因为您不需要处理它们:

$leaves_array = array_filter($leaves_array, function($val){
    return (!empty($val->LeaveFrom) && !empty($val->LeaveTo));
});

然后在循环上,父循环是叶子,内循环是项目。

尝试将它们转换为DateTime对象,以便您可以轻松地比较日期。然后在处理过程中,如果该键位于日期范围内,则将其放入临时持有者中,然后取消设置。取消设置后,再按下另一组新密钥,然后按键:

foreach($leaves_array as $leave) {
    $range = array();
    foreach ($project_array['Project 456'] as $date => $value) {
        try {
            $new_date = new DateTime($date);
            $from = new DateTime($leave->LeaveFrom);
            $to = new DateTime($leave->LeaveTo);
            if($new_date >= $from && $new_date <= $to) {
                $range[] = $date . '-Sick';
                unset($project_array['Project 456'][$date]);
            }
        } catch(Exception $e) {

        }

    }
    // changes
    foreach($range as $range_date) {
        $project_array['Project 456'][$range_date] = '00';
    }
    // resort
    ksort($project_array['Project 456']);
}

Sample Output

但我的建议是,不是改变这些键,为什么不在这些日期内创建一个数组,然后只是在其中推送相关的细节,比如留下日期和东西。