嗨,我
正在尝试从数组创建一个子数组,即认为我有一个数组
,如下所示 $array = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}
我将其分解并将其分配给变量$i..并运行 for 循环,如下所示。
for ( $i=0;$i<count($array);$i++) {
$a = array();
$b = $array[$i];
for($j=0;$j<count($array);$j++){
if($b != $array[$j]){
$a[] = $array[$j];
}
}
我想要的输出是当
$i = 1
数组应为
{2,3,4,5,6,7,8,9,10,11}
以及何时
$i = 2
数组应为
{3,4,5,6,7,8,9,10,11,12}
同样,当
$i=19
数组应为
{1,2,3,4,5,6,7,8,9,10}
那我该怎么做。
假设$i
应该是偏移量而不是数组中的实际值,您可以这样做
$fullArray = range(1, 19);
$i = 19;
$valuesToReturn = 10;
$subset = iterator_to_array(
new LimitIterator(
new InfiniteIterator(
new ArrayIterator($fullArray)
),
$i,
$valuesToReturn
)
);
print_r($subset);
这将提供您想要的输出,例如
$i = 1 will give 2 to 11
$i = 2 will give 3 to 12
…
$i = 10 will give 11 to 1
$i = 11 will give 12 to 2
…
$i = 19 will give 1 to 10
$i = 20 will give the same as $i = 1 again
等等。
$array = range(1, 19);
$i = 19;
$result = array();
$after = array_slice($array, $i, 10);
$before = array_slice($array, 0, 10 - count($after));
$result = array_merge($after, $before);
var_dump(json_encode($result));
附言请注意 0 元素有 1 个值,依此类推...
for ($i = 0; $i < count($array); $i++) {
if ($i + 10 < count($array))
$a = array_slice($array, $i, 10);
else
$a = array_merge(array_slice($array, $i), array_slice($array, 0, 10-(count($array)-$i)));
// do something with $a before it is over-written on the next iteration
}
此测试:
<?php
$array = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19);
for ($i = 0; $i < count($array); $i++) {
if ($i + 10 < count($array))
$a = array_slice($array, $i, 10);
else
$a = array_merge(array_slice($array, $i), array_slice($array, 0, 10-(count($array)-$i)));
echo "<h2>$i</h2>'n<pre>".print_r($a,true)."</pre><br />'n";
}
结果是:
0
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
[6] => 7
[7] => 8
[8] => 9
[9] => 10
)
...
9
Array
(
[0] => 10
[1] => 11
[2] => 12
[3] => 13
[4] => 14
[5] => 15
[6] => 16
[7] => 17
[8] => 18
[9] => 19
)
10
Array
(
[0] => 11
[1] => 12
[2] => 13
[3] => 14
[4] => 15
[5] => 16
[6] => 17
[7] => 18
[8] => 19
[9] => 1
)
...
18
Array
(
[0] => 19
[1] => 1
[2] => 2
[3] => 3
[4] => 4
[5] => 5
[6] => 6
[7] => 7
[8] => 8
[9] => 9
)
从我的角度来看,这很好用
<?php
$array = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19);
$size = sizeof($array); // Defining the array size
$str = 17; // This is the reference value from which you have to extract the values
$key = array_search($str, $array);
$key = $key+1; // in order to skip the given reference value
$start = $key%$size;
$end = $start+9;
for($i=$start; $i<=$end; $i++) {
$j = ($i%$size);
$result[] = $array[$j];
}
echo '<pre>'; print_r($result);
?>
数组上的轮询可以通过在每次迭代中执行"旋转"操作来实现:
for ($i = 0; $i < count($array); ++$i) {
// rotate the array (left)
array_push($array, array_shift($array));
// use $array
}
在循环期间,数组的第一个元素放在后面。在循环结束时,数组将恢复为其原始值。
看起来您所需要的只是数组中特定大小的切片,该切片环绕数组的末端并从开头继续。它将数组视为循环列表。
您可以通过多种方式实现这一点,最简单的方法之一(就代码行而言(是通过在其末尾附加原始数组的副本来扩展原始数组,并使用 PHP 函数array_slice()
提取您需要的切片:
function getWrappedSlice(array $array, $start, $count = 10)
{
return array_slice(array_merge($array, $array), $start, $count);
}
当然,您必须确保$start
介于 0
和 count($array) - 1
(包括(之间,否则函数返回的值将不是您所期望的值。