首页 > 解决方案 > 以 n 为单位分离和写入数据集的功能不起作用。尝试了 array_slice 和 for-loop

问题描述

我正在尝试从第一个到 n 递归地分离和写入 n 个数据点的块。

例如,我想要前 20 个,然后是下一个 20(从第二点开始),依此类推。从 1 到 20(在 40 个点的数据集中)。

它似乎在一开始就起作用,然后最后一个块偏移 1 个点。我确定它一定是最明显的错误,但我就是无法理解它!!!

我试过array_slice()一个for()循环。两者都给了我同样的错误。

function array_smas($series, $length){  # Uses array_slice()
    for($i = 0; $i < $length; $i++){
        echo "i = $i\n";
        $offset = $length - $i - 1;
        echo "offset = $offset\n";
        $series_n = array_slice($series, $offset, $length);
        file_put_contents(__DIR__."/file.txt", print_r($series_n, true), FILE_APPEND);
        file_put_contents(__DIR__."/file.txt", "\n\n", FILE_APPEND);   
    }
    return 0;
}



function array_smas_forloop($series, $length){  #   Uses for-loop
    for($i = 0; $i < $length; $i++){
        echo "i = $i\n";
        $series_n = array();
        for($c = 0; $c < $length; $c++){
            $series_n[] = $series[$c + $i];
        }
        file_put_contents(__DIR__."/file.txt", print_r($series_n, true), FILE_APPEND);
        file_put_contents(__DIR__."/file.txt", "\n\n", FILE_APPEND);   
    }
    return 0;
}

使用 40 个点的数据集,第一个和最后一个数组以及 $i 输出应该是:

i = 0
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
    [7] => 8
    [8] => 9
    [9] => 10
    [10] => 11
    [11] => 12
    [12] => 13
    [13] => 14
    [14] => 15
    [15] => 16
    [16] => 17
    [17] => 18
    [18] => 19
    [19] => 20
)


...



i = 18
Array
(
    [0] => 20
    [1] => 21
    [2] => 22
    [3] => 23
    [4] => 24
    [5] => 25
    [6] => 26
    [7] => 27
    [8] => 28
    [9] => 29
    [10] => 30
    [11] => 31
    [12] => 32
    [13] => 33
    [14] => 34
    [15] => 35
    [16] => 36
    [17] => 37
    [18] => 38
    [19] => 39
)


i = 19
Array
(
    [0] => 21
    [1] => 22
    [2] => 23
    [3] => 24
    [4] => 25
    [5] => 26
    [6] => 27
    [7] => 28
    [8] => 29
    [9] => 30
    [10] => 31
    [11] => 32
    [12] => 33
    [13] => 34
    [14] => 35
    [15] => 36
    [16] => 37
    [17] => 38
    [18] => 39
    [19] => 40
)

标签: phploops

解决方案


问题似乎是您不能$i = 19将第一个元素设为 21。我的逻辑是,如果您查看$i= 0 的第一个循环,则第一个元素是 1 - 所以 1 差异。但是当它是 19 时,您希望第一个元素比这个数字高 21 - 2。

如果在您中,array_smas_forloop()您将循环的限制更改为...

for($i = 0; $i <= $length; $i++){

那么你应该得到想要的输出。

但是,有很多数组创建和文件打开和关闭正在进行。另一种选择是在数组上创建一个“窗口”,每次删除第一项并在末尾添加一个新项。还要在函数的开头打开文件并在最后关闭它...

function array_smas_window($series, $length){  // Using for 'window'
    $output = fopen(__DIR__."/file.txt", "w");
    $window = array_slice($series, 0, $length);
    $i = 0;
    while(true) {
        fwrite($output, print_r($window, true)."\n\n");
        // If there are no more items, break the loop
        if ( !isset($series[$length+$i]) )  {
            break;
        }
        // Remove the first item
        array_shift($window);
        // Add a new one to the end
        $window[] = $series[$length+$i++];
     }
    fclose($output);
}

这也应该适用于任何窗口大小,因为它一直持续到没有更多项目要添加。


推荐阅读