>我有关联数组,例如:
$myArray = array(
'key1' => 'val 1',
'key2' => 'val 2'
...
);
我不知道前面的关键值,但想从第二个元素开始循环。 在上面的示例中,这将是从 key2 开始的。
我试过了
foreach(next(myArray) as $el) {
}
但这没有用。
替代方案可能array_slice
,但这似乎很混乱。 我错过了一些明显的东西吗?
确实没有"一种真正的方法"可以做到这一点。因此,我将它作为您应该去哪里的基准。
所有信息都基于此数组。
$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()
- 从数组返回当前键和值对,并前进数组游标。
请注意,each()
函数已从 PHP 7.2 开始弃用,并将在 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选项,因为它会编辑您的数组,而您从未说过这是可以接受的。
这取决于您是只想执行此操作一次还是多次,以及以后是否仍需要原始数组。
"第一"模式
$first = true;
foreach ($array as $key=>value) {
if($first) {
$first = false;
continue;
}
// ... more code ...
}
我个人经常使用这个解决方案,因为它非常简单,每个人都明白这一点。此外,创建新阵列不会对性能造成影响,您仍然可以在循环后对原始阵列进行操作。
但是,如果你有几个这样的循环,它开始看起来有点不干净,因为每个循环需要 5 行额外的代码。
array_shift
array_shift($array);
foreach ($array as $key=>value) {
// .... more code ....
}
array_shift
是为这种不需要第一个元素的特殊情况量身定制的函数。从本质上讲,这是一种 Perl 式的$array = array_slice($array, 1)
表达方式,可能并不完全明显,特别是因为它修改了原始数组。
因此,您可能需要复制原始数组并移动它,如果您以后既需要多次移动数组,也需要原始数组。
array_slice
当然,还有array_slice
本身。如果您希望原始数组保持不变并且多次需要切片数组,我认为array_slice
没有任何问题。但是,如果您确定自己总是只想切掉一个元素,则不妨使用速记array_shift
(如果需要,请先复制)。
你可以用显而易见的方式:
$flag = false;
foreach($myArray as $el) {
if($flag) {
// do what you want
}
$flag = true;
}
只是另一种灵活迭代的方式:
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 认证学习指南:
如您所见,使用这组函数 [重置, 下一个, 键, 当前, ...]需要相当多的工作;公平地说,有一些 它们提供唯一合理的迭代方式的情况 通过数组,特别是当您需要来回跳过时 在其元素之间。但是,如果您需要做的就是迭代 从头到尾贯穿整个数组,PHP 提供了一个方便的 foreach() 构造形式的快捷方式。
如果您的数组是基于 0 的,它将是 if($key>=1)
,但是当您的数组从键 1 开始时,这应该可以工作。
foreach ($array as $key=>$value){if($key>=2){
do stuff
}}
你可以试试:
$temp = array_shift($arr);
foreach($arr as $val) {
// do something
}
array_unshift($arr, $temp);
reset($myArray);
next($myArray);
while ($element = each($myArray))
{
//$element['key'] and $element['value'] can be used
}
当这个问题弹出时,我相当简单的解决方案。它有一个很好的优势,即很容易被修改,如果你愿意,可以跳过不仅仅是第一个元素。
$doomcounter = 0;
foreach ($doomsdayDevice as $timer){ if($doomcounter == 0){$doomcounter++; continue;}
// fun code goes here
}