我们说我有这个阵列:
$myArray = array(a, b, c, d, e, f, g);
我有一个开始指示符$startpos
,其可能的值可以是从0到myArray的元素数量的任何值。
因此,如果$startpos = 0
,所需的打印结果为a, b, c, d, e, f, g
如果$startpos = 2
,所需的打印结果为c, d, e, f, g, a, b
如果$startpos = 5
,所需的打印结果为f, g, a, b, c, d, e
我一直在通过SO搜索php内置或自定义功能(Treat an array as circular array when selecting elements - PHP处的类似问题)并查看http://www.w3schools.com/php/php_ref_array.asp,但我没有得到所需的结果。有人可以给我一个建议吗?
答案 0 :(得分:5)
您可以将array_slice
函数与array_merge
函数一起使用,如下所示:
$myArray = array('a', 'b', 'c', 'd', 'e', 'f', 'g');
$startpos = 2;
$output = array_merge(
array_slice($myArray,$startpos),
array_slice($myArray, 0, $startpos)
);
var_dump($output);
输出:
array(7) {
[0]=>
string(1) "c"
[1]=>
string(1) "d"
[2]=>
string(1) "e"
[3]=>
string(1) "f"
[4]=>
string(1) "g"
[5]=>
string(1) "a"
[6]=>
string(1) "b"
}
答案 1 :(得分:2)
<?php
$myArray = array(a, b, c, d, e, f, g);
$startpos = 3;
$o = f($myArray, $startpos);
echo json_encode($o);
function f($myArray, $startpos)
{
$o = array();
$l = count($myArray);
array_walk($myArray, function($v, $k) use(&$o, $l, $startpos)
{
$o[($k + $l - $startpos) % $l] = $v;
});
ksort($o);
return ($o);
}
或使用foreach方法。 demo
<?php
$myArray = array(a, b, c, d, e, f, g);
$startpos = 3;
echo json_encode(f($myArray, $startpos));
function f($myArray, $startpos)
{
$o = array();
$l = count($myArray);
foreach($myArray as $k => $v)
{
$o[($k + $l - $startpos) % $l] = $v;
}
ksort($o);
return $o;
}
outpur:["d","e","f","g","a","b","c"]
答案 2 :(得分:0)
如果您正在寻找一个简单的逻辑,您可以使用以下代码:
$myArray = array('a', 'b', 'c', 'd', 'e', 'f', 'g');
$startpos = <any_position>;
$dummy_startpos = $startpos; //keeping safe startpos for circular calculation
$initialpos = 0;
//loop to print element from startpos to end
while($dummy_startpos < count($myArray))
{
echo $myArray[$dummy_startpos] . ' ';
$dummy_startpos++;
}
//if startpos is not initial position
//start from first and print element till startpos
if($startpos > 0)
{
while($elementleft < $startpos)
{
echo $myArray[$elementleft] . ' ';
$elementleft++;
}
}
输出:
$ startpos:3
o / p:d e f g a b c
$ startpos:0
o / p:a b c d e f g