如何找到foreach索引

use*_*334 448 php foreach loops

有可能找到foreach索引吗?

在一个for循环如下:

for ($i = 0; $i < 10; ++$i) {
   echo $i . ' ';
}
Run Code Online (Sandbox Code Playgroud)

$i 会给你索引.

我是否必须使用for循环或是否有某种方法来获取foreach循环中的索引?

Owe*_*wen 832

foreach($array as $key=>$value) {
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这实际上是正确的,但不应该是接受的答案,因为键也可以是一个字符串.说你做`$ myarr ['foo'] ='bar';`这个方法失败了 (29认同)
  • @Bison你的意思是它没有失败.但它没有遵守OP问题.他正在寻找像第n个元素这样的数值. (12认同)
  • 当然,这个问题不是很具体,我认为这意味着OP基本上没有意识到$ key => $ value语法 (9认同)
  • 就像@Toskan所说,这不应该是公认的答案.我认为最好只在循环外创建一个变量并从那里开始计数,在每次迭代时用`vatiable ++;`增加它.传统的方式,但一直有效. (3认同)
  • 取决于 OP 对索引的含义:&lt;? $a = array(3,5,'xx',4312,'sasas'); 未设置($a[3]);foreach ($a as $k=&gt;$v) 打印 "\$k= $k and \$v = $v"; ?&gt; (2认同)

Con*_*oyP 161

你可以放入一个黑客攻击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++;
}
Run Code Online (Sandbox Code Playgroud)

  • 在循环中增加一个值几乎不是"黑客". (120认同)
  • @ThomasMcCabe有人甚至可能会说这是循环的核心用途之一. (15认同)

Bai*_*ker 25

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

  • 替代的+1,但是每次迭代中的函数调用比使用预先指定的变量稍微重一些(即使用来自`$ key => $ value`的`$ key`)...但是,我敢打赌,性能较低是在简单的循环中不显着/可察觉. (2认同)

Zor*_*che 19

欧文有一个很好的答案.如果您只想要密钥,并且您正在使用数组,这可能也很有用.

foreach(array_keys($array) as $key) {
//  do stuff
}
Run Code Online (Sandbox Code Playgroud)

  • 如果需要索引,`foreach(array_keys($ array)as $ index =&gt; $ key)`。 (2认同)

Óla*_*age 14

您可以$i在循环外创建并$i++在循环的底部执行.

  • 值得注意的是,这种方法给出了循环的当前迭代,而不是迭代数组的当前索引. (15认同)

小智 9

我用的++$key是而不是$key++从1开始。通常它是从0开始。

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

输出:

Question: 1
......
Question:2
.....
.
.
.
Run Code Online (Sandbox Code Playgroud)


小智 8

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

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

foreach ($things as $i=>$thing) { ... }
Run Code Online (Sandbox Code Playgroud)

例如

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

foreach ($things as $i=>$thing) {
    echo "Thing ".$i." is ".$thing;
}
Run Code Online (Sandbox Code Playgroud)

  • 不是它是一个关联数组 (17认同)

Mik*_*ams 6

我认为最好的选择是一样的:

foreach ($lists as $key=>$value) {
    echo $key+1;
}
Run Code Online (Sandbox Code Playgroud)

这很容易而且通常


The*_*Man 5

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

$var = array(2,5);

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

你的输出将是

2
5
Run Code Online (Sandbox Code Playgroud)

在这种情况下,数组中的每个元素都有一个已知的索引,但是如果您执行以下操作

$var = array_push($var,10);

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

你没有输出。发生这种情况是因为 PHP 中的数组不是像大多数语言中那样的线性结构。它们更像是哈希表,可能有也可能没有所有存储值的键。因此 foreach 不使用索引来抓取它们,因为如果定义了数组,它们只有一个索引。如果需要索引,请确保在遍历数组之前已完全定义数组,并使用 for 循环。


小智 5

PHP数组有内部指针,所以试试这个:

foreach($array as $key => $value){
   $index = current($array);
}
Run Code Online (Sandbox Code Playgroud)

对我来说没问题(虽然只是经过初步测试).