您好我正在尝试从array.i.e创建一个子数组;我想我有一个如下所示的数组
$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}
所以我该怎么办呢。
答案 0 :(得分:5)
假设$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
等等。
答案 1 :(得分: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
)
答案 2 :(得分: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);
?>
答案 3 :(得分: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));
P.S。请注意0元素有1个值,依此类推......
答案 4 :(得分:1)
看起来你需要的只是一个来自数组的特定大小的切片,切片包围数组的结尾并从头开始继续。它将数组视为循环列表。
你可以通过多种方式实现这一点,其中最简单的(就代码行而言)是通过在其末尾附加一个副本来扩展原始数组,并使用PHP函数array_slice()
来提取你需要的切片:
function getWrappedSlice(array $array, $start, $count = 10)
{
return array_slice(array_merge($array, $array), $start, $count);
}
当然,您必须确保$start
介于0
和count($array) - 1
之间(包括),否则函数返回的值将不符合您的预期。< / p>
答案 5 :(得分:1)
阵列上的循环可以通过在每次迭代中执行“旋转”操作来实现:
for ($i = 0; $i < count($array); ++$i) {
// rotate the array (left)
array_push($array, array_shift($array));
// use $array
}
在循环期间,数组的第一个元素放在后面。在循环结束时,数组将恢复为原始值。