我有关联数组,例如:
$myArray = array(
'key1' => 'val 1',
'key2' => 'val 2'
...
);
我不知道前面的键值,但想从第二个元素开始循环。在上面的示例中,这将是从key2开始。
我试过
foreach(next(myArray) as $el) {
}
但是没有用。
替代品可能是array_slice
,但这看起来很混乱。我错过了一些明显的东西吗?
答案 0 :(得分:20)
实际上没有“一种真正的方式”。所以我会把它作为你应该去哪里的基准。
所有信息都基于此数组。
$array = array(
1 => 'First',
2 => 'Second',
3 => 'Third',
4 => 'Fourth',
5 => 'Fifth'
);
array_slice()选项。你说过你认为这个选项太过分了,但在我看来,它是最短的代码。
foreach (array_slice($array, 1) as $key => $val)
{
echo $key . ' ' . $val . PHP_EOL;
}
这样做1000次需要0.015888
秒。
有处理指针的数组函数,例如......
current()
- 返回数组中的当前元素。end()
- 将数组的内部指针设置为最后一个元素。prev()
- 倒回内部数组指针。reset()
- 将数组的内部指针设置为第一个元素。each()
- 从数组中返回当前键和值对,并使数组光标前进。 请注意,自PHP 7.2起,each()
函数已被弃用,将在PHP 8中删除。
这些功能为您提供最快的解决方案,超过1000次迭代。
reset($array);
while (next($array) !== FALSE)
{
echo key($array) . ' ' . current($array) . PHP_EOL;
}
这样做1000次,需要0.014807
秒。
设置变量选项。
$first = FALSE;
foreach ($array as $key => $val)
{
if ($first != TRUE)
{
$first = TRUE;
continue;
}
echo $key . ' ' . $val . PHP_EOL;
}
这样做1000次需要0.01635
秒。
我拒绝了array_shift选项,因为它编辑了您的数组并且您从未说过这是可以接受的。
答案 1 :(得分:4)
这取决于您是想要只执行一次还是多次,以及稍后是否还需要原始数组。
$first = true;
foreach ($array as $key=>value) {
if($first) {
$first = false;
continue;
}
// ... more code ...
}
我个人经常使用这个解决方案,因为它非常简单,每个人都能得到这个。此外,创建新阵列没有性能损失,您仍然可以在循环后对原始阵列进行操作。
但是,如果你有这样的几个循环,它开始看起来有点不干净,因为每个循环需要额外5行代码。
array_shift($array);
foreach ($array as $key=>value) {
// .... more code ....
}
array_shift
是针对不需要第一个元素的特殊情况量身定制的函数。从本质上讲,这是一种说$array = array_slice($array, 1)
的Perl-ish方式,可能并不完全明显,特别是因为它修改了原始数组。
所以,你可能想制作原始数组的副本并移动它,如果你需要多次移位数组,以及稍后需要原始数组。
当然,还有array_slice
本身。如果您希望原始数组保持不变并且您需要多次切片数组,我认为array_slice
没有任何问题。但是,如果你总是希望只关闭一个元素,那么你也可以使用速记array_shift
(并在需要之前制作副本)。
答案 2 :(得分:2)
你可以用明显的方式:
$flag = false;
foreach($myArray as $el) {
if($flag) {
// do what you want
}
$flag = true;
}
答案 3 :(得分:2)
灵活迭代的另一种方式:
reset($myArray); // set array pointer to the first element
next($myArray); // skip first element
while (key($myArray) !== null) {
// do something with current($myArray)
next($myArray);
}
据我所知foreach
只是这种结构的一种捷径。
来自Zend PHP 5认证学习指南:
如您所见,使用这组函数[reset,next,key, 当前,...]需要相当多的工作;公平地说,有一些 他们提供唯一合理的迭代方式的情况 通过数组,特别是如果你需要来回跳过 它的元素之间。但是,如果您需要做的只是迭代 通过从开始到完成的整个数组,PHP提供了一个方便 foreach()构造形式的快捷方式。
答案 4 :(得分:2)
如果您的阵列 0 ,它将是if($key>=1)
,但是当您的阵列从 key 1 开始时,这应该可行。
foreach ($array as $key=>$value){if($key>=2){
do stuff
}}
答案 5 :(得分:1)
你可以尝试:
$temp = array_shift($arr);
foreach($arr as $val) {
// do something
}
array_unshift($arr, $temp);
答案 6 :(得分:1)
reset($myArray);
next($myArray);
while ($element = each($myArray))
{
//$element['key'] and $element['value'] can be used
}
答案 7 :(得分:0)
当这个问题弹出时,我的相当简单的解决方案。它有一个很好的优点,就是你可以轻松修改它,以便能够跳过不仅仅是第一个元素。
$doomcounter = 0;
foreach ($doomsdayDevice as $timer){ if($doomcounter == 0){$doomcounter++; continue;}
// fun code goes here
}