문제

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