Задать вопрос
@Sasha333

Array_chunk + последний эелемент массива дублируется в первый следующего?

Вопрос таков, имеется массив содержащий ip, необходимо его поделить на равные части, идеально подходит под это функция array_chunk, но ещё мне необходимо добавить в начало каждого дробленного массива последний элемент предыдущего.
Пример:
Имеется массив с данными
127.0.0.1
127.0.0.2
127.0.0.3
127.0.0.4
127.0.0.5
127.0.0.6
127.0.0.7
127.0.0.8
127.0.0.9

Делю массив через array_chunk($array, 4);
127.0.0.1
127.0.0.2
127.0.0.3
127.0.0.4

127.0.0.5
127.0.0.6
127.0.0.7
127.0.0.8

127.0.0.9

Далее мне необходимо добавить в каждый массив добавить в начало предшествующий элемент и на выходе получить:
127.0.0.1
127.0.0.2
127.0.0.3
127.0.0.4

127.0.0.4
127.0.0.5
127.0.0.6
127.0.0.7
127.0.0.8

127.0.0.8
127.0.0.9


Мой вариант
$count = count($users);
for ($i = 0; $i < $count; $i++) {
    $lastip = end($users[$i]);
    if ($i < $count - 1)
        array_unshift($users[$i + 1], $lastip); 
}

Возможно есть лучше варианты?
  • Вопрос задан
  • 199 просмотров
Подписаться 2 Простой 5 комментариев
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 4
@Sasha333 Автор вопроса
Всем большое спасибо, если кому либо необходимо решение, можно использовать любое из представленных. Немного результатов (на верность их не претендую, специальных условий никаких не делал, заливал просто на рабочий vds 1vcpu/1ram/ssd nvme):

как шаблон

<?php
$start = microtime(true);
$i = 0;
while ($i <= 100000)
    $array[] = '127.0.0.' . $i++;

//здесь предложенный код

var_dump($array);
echo 'Время выполнения скрипта: '.round(microtime(true) - $start, 4).' сек.';



nokimaro

<?php
$start = microtime(true);
$i = 0;

    while ($i <= 100000)
        $array[] = '127.0.0.' . $i++;

    $chunks = array_chunk($array, 4);

    foreach($chunks as $key => $vals)
    {
        $next_chunk_key = $key+1;
        if(isset($chunks[$next_chunk_key]))
        {
            //добавляем в начало след. чанка последний элемент текущего чанка
            array_unshift($chunks[$next_chunk_key], end($vals));
        }
    }

var_dump($array);
echo 'Время выполнения скрипта: '.round(microtime(true) - $start, 4).' сек.';

601d56f5bad50807779239.png


Compolomus

<?php
$start = microtime(true);
$i = 0;

    while ($i <= 100000)
        $array[] = '127.0.0.' . $i++;

    $result = []; // результат
    $len = 4; // длинна первого массива (менять для экспериментов)
    $c = ceil(count($array) / $len) - 1; // количество итераций
    $result[] = array_slice($array, 0, $len); // первый срез
    $offset = $len - 1; // смещение для первой итерации
    for (++$len, $j = 0, $i = 0; $i < $c; $i++, $offset += $len - 1, $j += $len) {
        $result[] = array_slice($array, $offset, $len);
    }

var_dump($array);
echo 'Время выполнения скрипта: '.round(microtime(true) - $start, 4).' сек.';

601d56fd2642d887983801.png


GogElf

<?php
$start = microtime(true);
$i = 0;

    while ($i <= 100000)
        $array[] = '127.0.0.' . $i++;

    $chunks = [];
    while($array){
      $current = array_splice($array, 0, 4);
      if(isset($old))
        array_unshift($current, $old);
      $old = end($current);
      $chunks[] = $current;
    };

var_dump($array);
echo 'Время выполнения скрипта: '.round(microtime(true) - $start, 4).' сек.';

601d5703ee8ab972315607.png


мой вариант

<?php
$start = microtime(true);
$i = 0;

    while ($i <= 100000)
        $array[] = '127.0.0.' . $i++;

    $array = array_chunk($array, 3);
    $count = count($array);
    for ($i = 0; $i < $count; $i++) {
        $lastip = end($array[$i]);
        if ($i < $count - 1)
            array_unshift($array[$i + 1], $lastip);
    }


var_dump($array);
echo 'Время выполнения скрипта: '.round(microtime(true) - $start, 4).' сек.';

601d570d5ddb1159595831.png
Ответ написан
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
<?php
$array = [
  '127.0.0.1',
  '127.0.0.2',
  '127.0.0.3',
  '127.0.0.4',
  '127.0.0.5',
  '127.0.0.6',
  '127.0.0.7',
  '127.0.0.8',
  '127.0.0.9',
];

$chunks = array_chunk($array, 4);

foreach($chunks as $key => $vals)
{
    $next_chunk_key = $key+1;
    if(isset($chunks[$next_chunk_key]))
    {
        //добавляем в начало след. чанка последний элемент текущего чанка
        array_unshift($chunks[$next_chunk_key], end($vals));
    }
}

print_r($chunks);
Ответ написан
Compolomus
@Compolomus Куратор тега PHP
Комполом-быдлокодер
Что то такое родилось
$array = [
    '127.0.0.1',
    '127.0.0.2',
    '127.0.0.3',
    '127.0.0.4',
    '127.0.0.5',
    '127.0.0.6',
    '127.0.0.7',
    '127.0.0.8',
    '127.0.0.9',
];

$result = []; // результат

$len = 4; // длинна первого массива (менять для экспериментов)

$c = ceil(count($array) / $len) - 1; // количество итераций

$result[] = array_slice($array, 0, $len); // первый срез

$offset = $len - 1; // смещение для первой итерации

for (++$len, $j = 0, $i = 0; $i < $c; $i++, $offset += $len - 1, $j += $len) {
    $result[] = array_slice($array, $offset, $len);
}

echo '<pre>' . print_r($result, true) . '</pre>';
Ответ написан
Комментировать
GogElf
@GogElf
Хокаге
Мой вариант
$array = [
	...
];

$chunks = [];
while($array){
	$current = array_splice($array, 0, 4);
	if(isset($old))
		array_unshift($current, $old);
	$old = end($current);
	$chunks[] = $current;
};

print_r($chunks);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽