【发布时间】:2010-09-27 03:48:53
【问题描述】:
我有以下代码:
if ($_POST['submit'] == "Next") {
foreach($_POST['info'] as $key => $value) {
echo $value;
}
}
如何让 foreach 函数从数组中的第二个键开始?
【问题讨论】:
我有以下代码:
if ($_POST['submit'] == "Next") {
foreach($_POST['info'] as $key => $value) {
echo $value;
}
}
如何让 foreach 函数从数组中的第二个键开始?
【问题讨论】:
我网站上的工作代码,用于跳过第一个结果然后继续。
<?php
$counter = 0;
foreach ($categoriest as $category) { if ($counter++ == 0) continue; ?>
它也在 tpl 文件中的 opencart 上工作,如果你需要,可以这样做。
【讨论】:
另一种方法是使用数组指针:
reset($_POST['info']); //set pointer to zero
while ($value=next($_POST['info']) //ponter+1, return value
{
echo key($_POST['info']).":".$value."\n";
}
【讨论】:
你不能取消设置数组吗...
所以如果我有一个不想要第一个实例的数组, 我可以:
unset($array[0]);
这将从数组中删除实例。
【讨论】:
这样的事情怎么样?使用 key() 和 current() 读取第一个键和值,然后 (编辑:不要使用 array_shift() 从数组中取出前面的元素array_shift(),它会重新编号任何数字数组中的索引,您并不总是想要!)。
OK,第一个值为 $firstKey, $firstVal
"); ####现在给其余的人
"); foreach( $arr as $key=>$val ) { 回声(“$key => $val
”); } ?>【讨论】:
如果您愿意丢弃第一个元素,可以使用array_shift()。然而,这在一个巨大的阵列上很慢。更快的操作将是
reset($a);
unset(key($a));
【讨论】:
array_shift() 会变慢多少?为什么unset 会更快?
array_shift() 是毒药!!它实际上重新编号所有数值数组索引——即使它们最初是稀疏的(例如,在 array_shift() 操作之后,定义的数组 array(1=>'a', 3=>'b', 99=>'c') 将等同于 array('0'=>'b', '1'=c)。不要@ 987654329@ 除非这是你想要的!!
在一个包含 1000 个元素的数组上,差异非常小。
测试:
<?php
function slice($a)
{
foreach(array_slice($a, 1) as $key)
{
}
return true;
}
function skip($a)
{
$first = false;
foreach($a as $key)
{
if($first)
{
$first = false;
continue;
}
}
return true;
}
$array = array_fill(0, 1000, 'test');
$t1 = time() + microtime(true);
for ($i = 0; $i < 1000; $i++)
{
slice($array);
}
var_dump((time() + microtime(true)) - $t1);
echo '<hr />';
$t2 = time() + microtime(true);
for ($i = 0; $i < 1000; $i++)
{
skip($array);
}
var_dump((time() + microtime(true)) - $t2);
?>
输出:
浮点数(0.23605012893677)
浮点数(0.24102783203125)
【讨论】:
first 不应该以真实开头吗?
如果你的表单结构不同
<input type='text' name='quiz[first]' value=""/>
<input type='text' name='quiz[second]' value=""/>
...然后在你的 PHP 中
if( isset($_POST['quiz']) AND
is_array($_POST['quiz'])) {
//...and we'll skip $_POST['quiz']['first']
foreach($_POST['quiz'] as $key => $val){
if($key == "first") continue;
print $val;
}
}
...您现在可以遍历该特定结构并正常访问rest
【讨论】:
如果您使用的是普通数组,我会说使用类似
foreach (array_slice($ome_array, 1) as $k => $v {...
但是,由于您正在查看用户请求,因此您对返回参数的顺序没有任何真正的保证 - 某些浏览器/代理可能会改变其行为,或者您可能只是决定修改您的将来形成。无论哪种方式,忽略数组的顺序并将 POST 值视为无序哈希映射对您来说都是最有利的,这给您留下了两个选择:
unset要忽略的键continue
【讨论】:
foreach($_POST['info'] as $key=>$value) {
if ($key == 0) { //or what ever the first key you're using is
continue;
} else {
echo $value;
}
}
【讨论】:
对于相当小的数组,使用array_slice 创建第二个:
foreach(array_slice($_POST['info'],1) as $key=>$value)
{
echo $value;
}
【讨论】:
foreach(array_slice($_POST['info'], 1) as $key=>$value) {
echo $value;
}
或者,如果您不想复制数组,您可以这样做:
$isFirst = true;
foreach($_POST['info'] as $key=>$value) {
if ($isFirst) {
$isFirst = false;
continue;
}
echo $value;
}
【讨论】:
在循环中:
if ($key == 0) //or whatever
continue;
【讨论】: