Задать вопрос
@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); 
}

Возможно есть лучше варианты?
  • Вопрос задан
  • 183 просмотра
Подписаться 2 Простой 5 комментариев
Решения вопроса 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);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы