合并具有公共值的多维数组中的数组

时间:2016-06-23 08:29:13

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

我在下面有以下多维数组。我正在尝试检查具有相同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

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
        )

)

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

1 个答案:

答案 0 :(得分:0)

您可以使用 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';
}