php - PHP:数组切片问题
问题描述
我在 php 中有一个小问题,我知道解决方案很简单,但我似乎无法解决它。
基本上我有一个数组,我需要它的小片直到最后。
<?php
$main = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
$start = 5;
$sliced = array_slice($main, $start);
$offset=3;
$startx = $start;
foreach($sliced as $s)
{
$start_pt = $startx-$offset;
$end_pt = ($startx) - count($main);
$sli = array_slice($main,$start_pt,$end_pt+1);
print_r($sli);
echo "<br>##############################<br>";
$startx++;
}
上面有点工作,除了最后一个返回空白的数组,因为长度现在是-1或-0。它将它作为长度而不是偏移量。
有任何更简单/更好的方法来完成上述操作吗?
结果 :
Array ( [0] => 3 [1] => 4 [2] => 5 [3] => 6 )
##############################
Array ( [0] => 4 [1] => 5 [2] => 6 [3] => 7 )
##############################
Array ( [0] => 5 [1] => 6 [2] => 7 [3] => 8 )
##############################
Array ( [0] => 6 [1] => 7 [2] => 8 [3] => 9 )
##############################
Array ( [0] => 7 [1] => 8 [2] => 9 [3] => 10 )
##############################
Array ( [0] => 8 [1] => 9 [2] => 10 [3] => 11 )
##############################
Array ( [0] => 9 [1] => 10 [2] => 11 [3] => 12 )
##############################
Array ( [0] => 10 [1] => 11 [2] => 12 [3] => 13 )
##############################
Array ( [0] => 11 [1] => 12 [2] => 13 [3] => 14 )
##############################
Array ( )
##############################
解决方案
我认为您的目的是从您的数组中制作相同长度的重叠范围,以便您可以尝试以下操作:
<?php
$main = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
function overlapped_chunks($array,$start,$length,$overlap=False){
if(!is_array($array)||!is_int($start)||!is_int($length))
return;
$go=false;
$range=[];
for($i=0;false!==key($array)&&NULL!==key($array);$i++){
$temp=[];
list(,$value)=each($array);
if($i===$start){
$go=true;
}
if($go){
$range[]=$value;
}
if(count($range)===$length){
$temp=$range;
$range=array_slice($range,$length-(is_int($overlap)&&$overlap<$length&&$overlap>=0?$overlap:$length-($length-1)));
yield $temp;
}
}
if($value!==end($temp)) yield $range;
}
foreach(overlapped_chunks($main,2,4,3) as $k=>$v){
print_r($v);
echo "<br>##############################<br>";
}
?>
这将打印
Array ( [0] => 3 [1] => 4 [2] => 5 [3] => 6 )
##############################
Array ( [0] => 4 [1] => 5 [2] => 6 [3] => 7 )
##############################
Array ( [0] => 5 [1] => 6 [2] => 7 [3] => 8 )
##############################
Array ( [0] => 6 [1] => 7 [2] => 8 [3] => 9 )
##############################
Array ( [0] => 7 [1] => 8 [2] => 9 [3] => 10 )
##############################
Array ( [0] => 8 [1] => 9 [2] => 10 [3] => 11 )
##############################
Array ( [0] => 9 [1] => 10 [2] => 11 [3] => 12 )
##############################
Array ( [0] => 10 [1] => 11 [2] => 12 [3] => 13 )
##############################
Array ( [0] => 11 [1] => 12 [2] => 13 [3] => 14 )
##############################
Array ( [0] => 12 [1] => 13 [2] => 14 [3] => 15 )
##############################
它适用于有序数组和关联数组
推荐阅读
- azure-logic-apps - “发送电子邮件”参数“附件内容”不能为空
- reactjs - 如何通过 API 数据设置 useState 来处理延迟
- scheme - 使用 readline 时如何抑制回显输入
- javascript - Javascript 在鼠标悬停时播放视频(多个视频)
- html - CSS 导入字体问题,无法直接访问 HTML
- postgresql - 查询年初至今,但跨越几年
- node.js - typescript 4.4.4:tsconfig 路径未按预期解析
- asp.net - Blazor 服务器 - HTTP 错误 500.30 - ASP.NET Core 应用程序无法启动
- javascript - Leaflet.Control.extension 导致 react-leaflet eventHandlers 出现问题
- django - 在 apache 服务器上部署 django 不起作用