php - 以 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
)
解决方案
问题似乎是您不能$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);
}
这也应该适用于任何窗口大小,因为它一直持续到没有更多项目要添加。
推荐阅读
- javascript - Javascript框架和Javascript库的区别
- vba - `Sub` 有指针吗?
- apache - Apache 不执行 .fcg 文件
- google-cloud-platform - elixir-phoenix-on-google-compute-engine 的问题
- mysql - SELECT REPLACE MySQL中相同值的多个情况
- java - Java 将两个数组合并为一个并对其进行排序
- google-chrome-extension - 如何将 chrome 扩展限制到某些域?
- amazon-dynamodb - cloudsearch日期范围查询
- c# - System.Windows.Forms.Timer 工作时间低于 30 分钟,停止工作 30 分钟
- android - 从android studio上的模拟器存储读取问题