Пользователь пока ничего не рассказал о себе

Достижения

Все достижения (1)

Наибольший вклад в теги

Все теги (3)

Лучшие ответы пользователя

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

    @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
    Ответ написан
    2 комментария

Лучшие вопросы пользователя

Все вопросы (5)