【问题标题】:Merging arrays in a multidimensional array with a common value将具有共同值的多维数组中的数组合并
【发布时间】:2016-10-25 11:07:41
【问题描述】:

我在下面有以下多维数组。我正在尝试检查具有相同 StartingDateTime 的数组。如果是这样,我想将它们合并到一个数组中,但我只想保留TWHourTEHour 的值并将它们重命名为TWHour1TEHour1。之后我想用相同的StartingDateTime 取消设置其他数组。

重要提示:可以有相同StartingDateTime的数组的个数可以超过2个。所以如果超过2个,TWHour&TEHour的重命名应该是连续的。例如,如果组合了 3 个数组,则会有 TWHour1TWHour2TWHour3 等。

我目前有这个代码。它可以合并数组并将它们重命名为 1。它还删除具有相同StartingDateTime 的数组。但是,代码有一定的问题。首先,由于第一个 if 语句,它给了我一个未定义的概念错误。其次,它仅限于一次合并,如果有更多则不会合并其余的。最后,当我取消设置时,它会跳过数组编号。它删除了。结果,您可以看到$items[3] 丢失了。通常,使用 unset 只会替换缺少的数组。

任何帮助将不胜感激。

$checker = 1;

for ($i = 0; $i < count($items); $i++) {

    // if they have the same StartingDateTime
    if ($items[$i]['StartingDateTime'] == $items[$checker]['StartingDateTime']) {

        // Transfer the values from the identified duplicate 
        // Have it renamed to TWHourx where x is the number of duplicates
        $items[$i]["TWHour1"] = $items[$checker]['TWHour'];
        $items[$i]["TEHour1"] = $items[$checker]['TEHour'];
        // After moving the values to the $i array
        // Delete the duplicated arrays  
        unset($items[$checker]);

        // 2nd Layer of filter, more filters will probably have similar codes    
        $checker2 = $checker + 1;
        if ($items[$i]['StartingDateTime'] == $items[$checker2]['StartingDateTime']) {
            $items[$i]["TWHour2"] = $items[$checker2]['TWHour'];
            $items[$i]["TEHour2"] = $items[$checker2]['TEHour'];
        }

        unset($items[$checker2]);
        $items = array_values($items);
    } else {
        // Do nothing
    }

    // Count($items) changes once it unsets an array
    // new count to get the new count value of $items array
    $newcount = count($items);
    if ($checker < $newcount) {
        $checker++;
    } else {
        // Do nothing
    }

}

过滤后的 $items 数组的提取

Notice: Undefined offset: 30 in line 116

[25] => Array
    (
        [StartingDateTime] => 2016-06-26
        [TWHour] => 00:00:00
        [TEHour] => 01:00:00
        [NoOfHoursWorked] => 10
        [NoOfHoursRest] => 14
        [Comments] => want
        [NoOfHoursRestAny24HR] => 14
        [NoOfHoursRestAny7Day] => 98
        [TWHour1] => 04:00:00
        [TEHour1] => 05:00:00
        [TWHour2] => 12:00:00
        [TEHour2] => 16:00:00
    )

$items 数组

Array
(
    [0] => Array
        (
            [StartingDateTime] => 2016-06-26
            [TWHour] => 19:30:00
            [TEHour] => 23:30:00
            [NoOfHoursWorked] => 10
            [NoOfHoursRest] => 14
            [Comments] => any time
            [NoOfHoursRestAny24HR] => 14
            [NoOfHoursRestAny7Day] => 98
        )

    [1] => Array
        (
            [StartingDateTime] => 2016-06-27
            [TWHour] => 13:30:00
            [TEHour] => 23:30:00
            [NoOfHoursWorked] => 10
            [NoOfHoursRest] => 14
            [Comments] => I 
            [NoOfHoursRestAny24HR] => 14
            [NoOfHoursRestAny7Day] => 98
        )

    [2] => Array
        (
            [StartingDateTime] => 2016-06-28
            [TWHour] => 03:00:00
            [TEHour] => 05:00:00
            [NoOfHoursWorked] => 10
            [NoOfHoursRest] => 14
            [Comments] => want
            [NoOfHoursRestAny24HR] => 14
            [NoOfHoursRestAny7Day] => 98
        )

    [3] => Array
        (
            [StartingDateTime] => 2016-06-28
            [TWHour] => 13:30:00
            [TEHour] => 23:30:00
            [NoOfHoursWorked] => 10
            [NoOfHoursRest] => 14
            [Comments] => want
            [NoOfHoursRestAny24HR] => 14
            [NoOfHoursRestAny7Day] => 98
        )

    [4] => Array
        (
            [StartingDateTime] => 2016-06-29
            [TWHour] => 13:30:00
            [TEHour] => 23:30:00
            [NoOfHoursWorked] => 10
            [NoOfHoursRest] => 14
            [Comments] => to rest
            [NoOfHoursRestAny24HR] => 14
            [NoOfHoursRestAny7Day] => 98
        )

    [5] => Array
        (
            [StartingDateTime] => 2016-06-30
            [TWHour] => 12:30:00
            [TEHour] => 23:30:00
            [NoOfHoursWorked] => 10
            [NoOfHoursRest] => 14
            [Comments] => hehe
            [NoOfHoursRestAny24HR] => 14
            [NoOfHoursRestAny7Day] => 98
        )

)

预期结果

Array
(
    [0] => Array
        (
            [StartingDateTime] => 2016-06-26
            [TWHour] => 19:30:00
            [TEHour] => 23:30:00
            [NoOfHoursWorked] => 10
            [NoOfHoursRest] => 14
            [Comments] => any time
            [NoOfHoursRestAny24HR] => 14
            [NoOfHoursRestAny7Day] => 98
        )

    [1] => Array
        (
            [StartingDateTime] => 2016-06-27
            [TWHour] => 13:30:00
            [TEHour] => 23:30:00
            [NoOfHoursWorked] => 10
            [NoOfHoursRest] => 14
            [Comments] => I 
            [NoOfHoursRestAny24HR] => 14
            [NoOfHoursRestAny7Day] => 98
        )

    [2] => Array
        (
            [StartingDateTime] => 2016-06-28
            [TWHour] => 03:00:00
            [TEHour] => 05:00:00
            [NoOfHoursWorked] => 10
            [NoOfHoursRest] => 14
            [Comments] => want
            [NoOfHoursRestAny24HR] => 14
            [NoOfHoursRestAny7Day] => 98
            [TWHour1] => 13:30:00
            [TEHour1] => 23:30:00
        )

    [3] => Array
        (
            [StartingDateTime] => 2016-06-29
            [TWHour] => 13:30:00
            [TEHour] => 23:30:00
            [NoOfHoursWorked] => 10
            [NoOfHoursRest] => 14
            [Comments] => to rest
            [NoOfHoursRestAny24HR] => 14
            [NoOfHoursRestAny7Day] => 98
        )

    [4] => Array
        (
            [StartingDateTime] => 2016-06-30
            [TWHour] => 12:30:00
            [TEHour] => 23:30:00
            [NoOfHoursWorked] => 10
            [NoOfHoursRest] => 14
            [Comments] => hehe
            [NoOfHoursRestAny24HR] => 14
            [NoOfHoursRestAny7Day] => 98
        )

)

编辑:更新了我的代码。它合并但是当我尝试为更多具有相同起始日期时间的数组添加另一层过滤器时。我再次收到未定义的偏移错误。

【问题讨论】:

    标签: php arrays multidimensional-array associative-array key-value


    【解决方案1】:

    您好,使用 array_values 将重置您的数组索引。过滤后使用

    $items = array_values($items);
    

    更新代码:- $item 将是您的重复数组,$finalArr 将是最终结果数组

    $finalArr = array();
    foreach($items as $key=>$val){
        $k = searchForId($val['StartingDateTime'],$finalArr);
        if($k != 'blank'){
            $finalArr[$key]['TWHour1'] = $val['TWHour'];
            $finalArr[$key]['TEHour1'] = $val['TEHour'];
        } else {
            $finalArr[] = $val; 
        }
    }
    
    public function  searchForId($strDateTime,$array) {
    
        foreach ($array as $key => $val) {
            if(array_key_exists('StartingDateTime', $val)){
                if ($val['StartingDateTime'] == $strDateTime) {
                   return $key;
                }
            }
        }
        return 'blank';
    }
    

    【讨论】:

    • 我无言以对。它确实有效。非常感谢楼主,你的回答对我帮助很大。我真的很感激它,它解决了大部分问题。如果有更多数组具有共同的 StartingDateTime,您对如何合并更多数组有什么想法吗?
    • 使用这一个 $array = array_unique (array_merge ($array1, $array2));
    • 我不太确定如何实现它,因为我只想保留 TWHour 和 TEHour 的值并将它们重命名为 TWHour1 和 TEHour1。我试图实现它,但它给了我参数和参数错误。
    • 抱歉回复晚了,我现在才有机会尝试代码。我得到一个未定义的索引:StartingDateTime。这一行,如果 ($val['StartingDateTime'] == $strDateTime)
    • 它可以工作,但它只提取小时数,不会合并到具有相同起始日期时间的数组中。此外,当有多个具有相同 StartingDateTime 的数组时,它不会将 TEHour 和 TWHour 重命名为 TWHour1、TEHour1、TWHour2、TEHour2
    猜你喜欢
    • 2017-04-27
    • 2012-03-04
    • 2019-12-14
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 2018-09-20
    • 2021-11-26
    相关资源
    最近更新 更多