如何在 PHP 中的数组中使用轮询方法


how to use round robin method in array in php?

嗨,我

正在尝试从数组创建一个子数组,即认为我有一个数组

,如下所示
 $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介于 0count($array) - 1(包括(之间,否则函数返回的值将不是您所期望的值。