Разбить массив на части со смещением

Имеется следующий массив:

$arr = [
    "0"=>"2010",
    "1"=>"2011",
    "2"=>"2012",
    "3"=>"2013",

    // ...
    // ...
    // ...,

    "10"=>"2020",
    "n"=>"..."
];

Мне нужно получить из него массив следующего вида:

//Получить массивы
Array
(
    [0] => Array
        (
            [0] => 2010
            [1] => 2011
        )

    [1] => Array
        (
            [0] => 2011
            [1] => 2012
        )

    [2] => Array
        (
            [0] => 2012
            [1] => 2013
        )
    [n-1] => Array
        (
            [0] => 2019
            [1] => 2020
        )
    [n] => Array
        (
            [0] => 20nn
        )
)

Необходимо разбить тот массив лет на интервалы таким образом чтобы конец каждого интервала становился началом следующего.


Ответы (1 шт):

Автор решения: Михаил Ребров

В вашем случае нужно просто пройтись со второго до предпоследнего элемента и складывать в новый массив один вложенный массив, состоящий из элемента с текущим индексом и с индексом на единицу меньше.

Чтобы не городить проверок внутри цикла - последний элемент проще положить вручную

<?php
$data = [
    0 => 2000, 1 => 2001, 2 => 2002, 3 => 2003, 4 => 2004,
    5 => 2005, 6 => 2006, 7 => 2007, 8 => 2008, 9 => 2009,
    10 => 2010, 11 => 2011, 12 => 2012, 13 => 2013, 14 => 2014,
    15 => 2015, 16 => 2016, 17 => 2017, 18 => 2018, 19 => 2019,
    20 => 2020, 21 => 2021,  22 => 2022
];
$result = [];
// обход начинаем не с первого, а со второго элемента, 
// чтобы предыдущий элемент всегда был в наличии
// заканчиваем предпоследним, чтобы не выйти за границы массива
// и чтобы не городить проверки внутри цикла 
for ( $i=1; $i < count($data)-1; $i++) {
    $result[]= [
        $data[$i-1], // предыдущий элемент
        $data[$i]    // текущий элемент
    ];
}
// последний вложенный массив из одного элемента проще вставить вручную
$result[]=[
    $data[count($data)-1]
];
print_r($result);

вывод

Array
(
    [0] => Array
        (
            [0] => 2000
            [1] => 2001
        )

    [1] => Array
        (
            [0] => 2001
            [1] => 2002
        )

    [2] => Array
        (
            [0] => 2002
            [1] => 2003
        )

    [3] => Array
        (
            [0] => 2003
            [1] => 2004
        )

    ...

    [19] => Array
        (
            [0] => 2019
            [1] => 2020
        )

    [20] => Array
        (
            [0] => 2020
            [1] => 2021
        )

    [21] => Array
        (
            [0] => 2022
        )

)
→ Ссылка