如何找到foreach循环的索引?

649

是否可以在以下的 for 循环中找到 foreach 的索引?

for ($i = 0; $i < 10; ++$i) {
   echo $i . ' ';
}

$i 将会给你索引。

我是否必须使用 for 循环,或者在 foreach 循环中有没有某种方法可以获取索引?

14个回答

1184
foreach($array as $key=>$value) {
    // do stuff
}

$key 是每个 $array 元素的索引。


2
取决于 OP 所指的索引是什么意思: <? $a = array(3,5,'xx',4312,'sasas'); unset($a[3]); foreach ($a as $k=>$v) print "$k= $k and $v = $v"; ?> - Milen A. Radev
9
这个问题不是很具体,我理解为提问者基本上不了解 $key=>$value 语法。 - Owen
64
这个回答其实是正确的,但不应该被接受作为标准答案,因为 key 也可以是一个字符串。比如说你执行 $myarr['foo'] = 'bar';,这种方法就会失败。 - Toskan
13
@Bison,你的理解是正确的,它并不会失败。但它未能回答OP的问题。他在寻找像第n个元素这样的数字值。 - Toskan
9
就像@Toskan说的那样,这不应该被接受作为答案。我认为更好的做法是在循环外创建一个变量,并从那里开始计数,在每一次迭代中使用variable++;增加它。这是传统的方法,但一直以来都有效。 - Jomar Sevillejo
显示剩余3条评论

214
你可以在foreach中添加一个hack,例如在每次运行时增加的字段,这正是数字索引数组中for循环提供的内容。这样的字段将是一个需要手动管理(增量等)的伪索引。 foreach将以$key值的形式给出你的索引,因此这样的hack是不必要的。
例如,在foreach中:
$index = 0;
foreach($data as $key=>$val) {
    // Use $key as an index, or...

    // ... manage the index this way..
    echo "Index is $index\n";
    $index++;
}

157
在循环中对数值进行递增几乎不算是一种“hack”。 - theflowersoftime
26
甚至可以说这是循环的核心用法之一。 - Byson

33

需要注意的是,您可以在任何数组上调用key()来查找当前的键。 正如您所想的那样,current()将返回当前值,next()会将数组指针移动到下一个元素。


如果您想使用普通的PHP关联数组来存储要通过Iterable接口公开的数据(需要跟踪循环中的位置),那么这将非常有用。 - Peter
3
赞同使用另一种方法,但是在每次迭代中调用函数比使用预分配的变量(即使用“$key =>$value”中的“$key”)更加耗费资源。不过,在简单循环中,我相信性能差异不会明显或可察觉。 - Armfoot

25

Owen给出了一个好答案。如果你只想得到关键信息,并且正在使用数组,这也可能非常有用。

foreach(array_keys($array) as $key) {
//  do stuff
}

6
如果您需要索引,可以使用 foreach(array_keys($array) as $index=>$key) - Leo

19

你可以在循环外创建$i,并在循环底部执行$i++


22
值得注意的是,这种方法提供的是循环的当前迭代结果,而不是迭代数组的当前索引。 - Peter Bailey

12

按照这个代码:

foreach ($lists as $key=>$value) {
    echo $key+1;
}

这是简单而干净的代码


11

这两个循环是等价的(当然除了安全栏杆):

for ($i=0; $i<count($things); $i++) { ... }

foreach ($things as $i=>$thing) { ... }

例如

for ($i=0; $i<count($things); $i++) {
    echo "Thing ".$i." is ".$things[$i];
}

foreach ($things as $i=>$thing) {
    echo "Thing ".$i." is ".$thing;
}

21
如果这是一个关联数组,那就不行。 - JoeCortopassi

9

我使用++$key代替$key++来从1开始计数。通常它从0开始。

@foreach ($quiz->questions as $key => $question)
 <h2> Question: {{++$key}}</h2>
 <p>{{$question->question}}</p>
@endforeach

输出:

Question: 1
......
Question:2
.....
.
.
.

8

PHP数组有内部指针,因此请尝试以下内容:

foreach($array as $key => $value){
   $index = current($array);
}

我觉得可以(虽然只进行了初步测试)。


$key 是 $index,而 current($array) 等于 $value。因此两者都不需要,只需使用 $index 和 $value。 - doraemon

5

乔纳森是正确的。PHP数组充当将键映射到值的映射表。在某些情况下,如果定义了您的数组,则可以获得索引,例如

$var = array(2,5);

for ($i = 0; $i < count($var); $i++) {
    echo $var[$i]."\n";
}

你的输出将会是

2
5

如果数组中的每个元素都有一个可知的索引,那么您可以轻松地访问它们。但是,如果您执行以下操作:

$var = array_push($var,10);

for ($i = 0; $i < count($var); $i++) {
    echo $var[$i]."\n";
}

如果你在PHP中使用foreach循环遍历数组时,发现没有任何输出,这可能是因为PHP中的数组不像大多数语言中一样是线性结构,而更像哈希表,可能并不具有所有存储值的键。因此,foreach循环不使用索引来遍历它们,因为只有在数组被定义时才有索引。如果需要索引,请确保在遍历之前完全定义了你的数组,并使用for循环。


是的,这就是为什么在PHP中我们必须通过而不是索引来“连接数组”... 参见array_map(func,$a,$b)。 - Peter Krauss
Ops,亲爱的读者和@TheBrawnyMan,请记住你们的例子就像array_push() bug一样!建议使用$var[] = 10;(请参考PHP链接指南),这样第二个for循环可以输出期望的结果。 - Peter Krauss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接