如何找到foreach索引?


489

是否可以找到foreach索引?

在一个for循环如下:

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

$i 会给你索引。

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

Answers:


908
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)打印“ \ $ k = $ k和\ $ v = $ v”;?>
Milen A. Radev

9
绝对,这个问题不是很具体,我认为这意味着OP在很大程度上没有意识到$ key => $ value语法
Owen

38
嗯,这实际上是正确的,但不应作为公认的答案,因为key也可以是字符串。说您执行$myarr['foo'] = 'bar';此方法失败
Toskan 2014年

12
@Bison,您的意思是,它不会失败。但是它不能满足OP问题。他正在寻找第n个元素之类的数值。
Toskan 2014年

3
就像@Toskan所说的那样,这不应是公认的答案。我认为最好在循环外创建一个变量并从那里开始计数,并vatiable++;在每次迭代时增加它。传统方式,但一直有效。
Jomar Sevillejo,2015年

172

您可以将hack放入您的hack中foreach,例如在每次运行时都增加一个字段,这正是for循环在数字索引数组中为您提供的内容。这样的字段将是需要人工管理(增加等)的伪索引。

A foreach将以您的$key价值形式为您提供索引,因此这种黑客是不必要的。

例如,在 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++;
}

127
在循环中增加值几乎不是“黑客”。
Thomas McCabe 2013年

17
@ThomasMcCabe甚至可能说这是循环的核心用途之一。
拜森2014年

26

应该注意的是,您可以调用key()任何数组来查找当前键。您可以猜测current()将返回当前值,next()并将数组的指针移动到下一个元素。


如果您想使用一个普通的旧的PHP关联数组来存储要通过Iterable接口公开的数据(您需要在该位置跟踪循环中的位置),这将很有用。
彼得

2
+1是替代方法,但是每次迭代中的函数调用都比使用预分配的变量(即,使用$keyfrom $key=>$value)要重一些。但是,我敢打赌,在一个简单的循环中,较低的性能是不重要的/可以感知的。
Armfoot

20

欧文(Owen)有一个很好的答案。如果只需要键,并且正在使用数组,则这可能也很有用。

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

4
如果您需要索引,则foreach(array_keys($array) as $index=>$key)
狮子座

14

您可以$i在循环外部创建,也可以在循环$i++底部进行。


16
重要的是要注意,这种方法给出的是循环的当前迭代,而不是迭代数组的当前索引。
彼得·贝利

8

这两个循环是等效的(当然,请注意安全栏杆):

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;
}

17
如果它是一个关联数组
不会-JoeCortopassi 2011年


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不使用索引对它们进行爬网,因为如果定义了数组,则它们仅具有索引。如果需要索引,请在对数组进行爬网之前确保对其进行了完全定义,并使用for循环。


是的,这就是为什么在PHP中我们必须通过而不是通过索引“ 联接数组”的原因。另请参见array_map(func,$ a,$ b)。
彼得·克劳斯

亲爱的读者和@TheBrawnyMan,操作人员,请记住您的示例就像是array_push()错误(!)。推荐使用$var[] = 10;(请参见PHP链接以进行指导),因此第二个for循环将输出预期的结果。
彼得·克劳斯

4

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

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

对我来说还可以(虽然只是经过初步测试)。


1

我通常在使用关联数组时执行此操作:

foreach ($assoc_array as $key => $value) {
 //do something
}

这也可以与非关联数组一起使用。$ key将是索引值。如果您愿意,也可以这样做:

foreach ($array as $indx => $value) {
  //do something
}

4
“替代”是什么?您知道这是相同的,除了变量名吗?因此,我要说的是最后一句话和代码块是不必要的-如果它做了任何使它感到困惑的事情。
Dennis98,2016年

@ Dennis98的区别在于,其中一个具有关联数组作为输入,而另一个具有数字数组。虽然我猜答案会更详细些会更好。
I_ATE_YOUR_WORK_FILES '18年

0

我想添加这个,我在laravel中使用它只是索引我的表:

  • 使用$ loop-> index
  • 我还使用++ $ loop对其进行了预递增,使其从1开始

我的代码:

@foreach($resultsPerCountry->first()->studies as $result)
  <tr>
    <td>{{ ++$loop->index}}</td>                                    
  </tr>
@endforeach

laravel没有问这个问题。$loop不能使用该变量,因为要求使用通用PHP。
Özgür的灿卡拉格兹

0

当我不得不在相同的上下文中使用foreach索引和值时,我以这种方式解决了:

$array = array('a', 'b', 'c');
foreach ($array as $letter=>$index) {

  echo $letter; //Here $letter content is the actual index
  echo $array[$letter]; // echoes the array value

}//foreach

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.