【问题标题】:Remove consecutive elements given a starting key and an ending key删除给定开始键和结束键的连续元素
【发布时间】:2022-02-10 00:12:51
【问题描述】:

我有一个输入数组,其中的键代表 24 小时“军事”时间,值代表 12 小时“上午/下午”时间。我想从我的数组中删除由两个包含“军事”时间值的变量确定的连续元素。

这是我的输入变量:

$starttime = '5';
$endtime = '17';
$timings = array(
     '0' => '12AM',
     '1' => '1AM',
     '2' => '2AM',
     '3' => '3AM',
     '4' => '4AM',
     '5' => '5AM',
     '6' => '6AM',
     '7' => '7AM',
     '8' => '8AM',
     '9' => '9AM',
     '10' => '10AM',
     '11' => '11AM',
     '12' => '12PM',
     '13' => '1PM',
     '14' => '2PM',
     '15' => '3PM',
     '16' => '4PM',
     '17' => '5PM',
     '18' => '6PM',
     '19' => '7PM',
     '20' => '8PM',
     '21' => '9PM',
     '22' => '10PM',
     '23' => '11PM',
);

foreach ($timings as $t) {
    
}

我想在 foreach 循环中迭代计时,但在此之前,我想删除开始时间和结束时间之间的计时。

这里我的$starttime 密钥是5,我的$endtime 密钥是17

所以我想从数组中删除5,6,7,8,9,10,11,12,13,14,15,16,17 并保留剩余的元素。

谁能告诉我如何弹出这些元素?

【问题讨论】:

    标签: php range key filtering sequential-number


    【解决方案1】:

    切片和合并

    只需像这样使用array_slicearray_merge

    $starttime = '5';
    $endtime = '17';
    
    $timings = array_merge(
                  array_slice($timings, 0, intval($starttime)),
                  array_slice($timings, intval($endtime) + 1)
               );
    

    拼接

    另一种更简单且(微不足道)更有效的方法是使用array_splice。请注意,它返回提取的数组,并更改原始数组,因此不要将结果放在 $timings 中。

    $starttime = '5';
    $endtime = '17';
    
    array_splice($timings,
                 intval($starttime),
                 (intval($endtime) - intval($starttime))
                );
    

    【讨论】:

    • 您好,感谢您的回答。我试过你的代码。但它做的恰恰相反。它保留 5,6,7,8,9,10,11,12,13,14,15,16,17 而不是从数组中删除。你能告诉我如何解决这个问题吗?
    • @Giri:我已经用另一种方式编辑了答案。甚至可能比使用 array_diff() 更有效
    • @ltay 当我使用$starttime = '0'; $endtime = '23'; 时,它仍然只保留最后一个值。知道如何解决这个问题吗?
    • @Giri:也许你应该在第二个数组偏移量上加 1。像这样:array_slice($timings, (intval($endtime) + 1))
    • @Giri :我使用 array_splice 添加了一个更好的解决方案。
    【解决方案2】:

    我觉得有必要说明一些技术会破坏原始密钥,而另一些会保留原始密钥。

    代码:(Demo)

    丢失钥匙

    function spliceKeys($timings, $starttime, $endtime) {
        array_splice($timings, $starttime, $endtime - $starttime);
        return $timings;
        
    }
    
    function sliceKeys($timings, $starttime, $endtime) {
        return array_merge(
                  array_slice($timings, 0, $starttime),
                  array_slice($timings, $endtime + 1)
               );
    }
    

    保留密钥

    function diffKeys($timings, $starttime, $endtime) {
        return array_diff_key($timings, array_flip(range($starttime, $endtime)));
    }
    
    function skipKeys($timings, $starttime, $endtime) {
        $result = [];
        foreach ($timings as $military => $timing) {
            if ($military >= $starttime && $military <= $endtime) {
                continue;
            }
            $result[$military] = $timing;
        }
        return $result;
    }
    
    function unsetKeys($timings, $starttime, $endtime) {
        $result = [];
        foreach ($timings as $military => $timing) {
            if ($military >= $starttime && $military <= $endtime) {
                unset($timings[$military]);
            }
        }
        return $timings;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-12
      • 2017-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-09
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      相关资源
      最近更新 更多