I have an input array with keys representing 24-hour "military" time and values representing 12-hour "am/pm" time. I want to remove consecutive elements from my array determined by two variables that contain "military" time values.

Here are my input variables:

$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) {
    
}

I would like to iterate the timings in a foreach loop, but before that, I would like to remove the timings between start time and end time.

Here my $starttime key is 5 and my $endtime key is 17.

So I would like to remove 5,6,7,8,9,10,11,12,13,14,15,16,17 from the array and keep the remaining elements.

Can some tell me how to pop those elements out?

有帮助吗?

解决方案

Slice and Merge

Just use array_slice and array_merge like this:

$starttime = '5';
$endtime = '17';

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

Splice

Another way which is simpler and a (insignificantly) more efficient is using array_splice. Notice that it returns the extracted array, and changes the original array, so don't place the result inside $timings.

$starttime = '5';
$endtime = '17';

array_splice($timings,
             intval($starttime),
             (intval($endtime) - intval($starttime))
            );

其他提示

I feel that it is necessary to spell out that some techniques will destroy the original keys and other will preserve the original keys.

Codes: (Demo)

Loses Keys

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)
           );
}

Keeps Keys

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;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top