如何在php中使用轮询方法对数组进行操作?

5

你好,我正在尝试从一个数组中创建一个子数组,例如:假设我有一个如下所示的数组

 $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}

那么我该怎么做呢?

你明白循环的每次迭代都会覆盖 $a 和 $b 的值吗? - Peter Bowers
你能解释一下那个标准吗? - Hanky Panky
预期输出是什么? - sectus
@Hanky웃Panky,我没听懂你的意思。 - Amie james
我的意思是,您能否告诉我们一些关于您的标准的信息。输出应该如何推导?例如,当i为1时,为什么它只应该到11而不是数组的末尾?如果不知道标准,那么就只能靠猜测了。 - Hanky Panky
如果您尝试为锦标赛安排实现循环赛制,采用此方法可能会遇到问题。 - billyonecan
6个回答

6
假设$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

等等类似内容。


这是否假定数组范围是有序的?而且它非常好。炫耀一下吧;] - Pogrindis
@Pogrindis 不,LimitIterator 是基于 InfiniteIterator 的偏移量来确定子集中的项。子集将按照 $fullArray 中的顺序返回,包括键。这对于关联数组也适用。 - Gordon

2
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
)

1
虽然我没有点踩,但你能告诉我们这个代码如何每次创建一个包含10个元素的数组块吗? - Hanky Panky
你是对的 - 问题要么被编辑了,要么我没有仔细阅读。回答已经被编辑... - Peter Bowers

2

从我的角度来看,这很好用。

<?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);


?>

2
$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 个元素有一个值,依此类推...


2
在数组上进行轮流操作可以通过在每次迭代内执行“旋转”操作来实现:
for ($i = 0; $i < count($array); ++$i) {
    // rotate the array (left)
    array_push($array, array_shift($array));
    // use $array
}

在循环过程中,数组的第一个元素被放置到最后。在循环结束时,数组恢复到其原始值。

1
看起来你只需要从数组中获取一定大小的切片,这个切片会在数组末尾绕回并继续从开头开始。它将数组视为循环列表。
有许多方法可以实现这一点,其中最简单(以代码行数计)的之一是通过在其末尾附加一个副本来扩展原始数组,并使用PHP函数array_slice()提取所需的切片:
function getWrappedSlice(array $array, $start, $count = 10)
{
    return array_slice(array_merge($array, $array), $start, $count);
}

当然,你必须确保$start0count($array) - 1之间(包括这两个数),否则该函数返回的值将不符合你的预期。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接