Question

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?

Was it helpful?

Solution

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

OTHER TIPS

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;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top