How to find the foreach index
是否可以找到foreach指数?
在for循环中,如下所示:
1 2 3
| for ($i = 0; $i < 10; ++$i) {
echo $i . ' ';
} |
$i会给你索引。
我是否必须使用for循环,或者有什么方法可以在foreach循环中获取索引?
1 2 3
| foreach($array as $key=>$value) {
// do stuff
} |
$key是每个$array元素的索引。
- 取决于op的索引含义:<?$A=数组(3,5,'xx',4312,'sasas as');未设置($A[3]);foreach($A as$K=>V)打印"$K=$K和$V=$V";?>
- 当然,这个问题不是很具体,我认为这意味着OP在很大程度上不知道$key=>value语法
- 这实际上是对的,但不应该是公认的答案,因为键也可以是字符串。假设你做了$myarr['foo'] = 'bar';这个方法失败了
- @托斯卡纳为什么会失败?在关联数组中,唯一存在的索引是字符串$key。所以foreach($array as $key=>$value)会把"foo"放在$key里,正如你所期望的那样。任何数值索引都无法映射到数组中的特定元素。最好可以说它是第n个元素,但是如果使用for($i = 0; $i < count($array); $i++),如果索引是unset(),或者数字索引是手动决定的(如$array = [2 =>"myvariable","myOtherVariable"]),则可以使用数字数组来处理完全相同的问题。
- @野牛你是对的,意思是它不会失败。但是它没有遵守操作问题。他在寻找第n个元素这样的数值。
- 正如@toskan所说,这不应该是公认的答案。我认为最好在循环外部创建一个变量并从中计数,在每次迭代中使用vatiable++;增加它。传统的方式,但一直有效。
- 今天访问这个,我发现在一个XML元素上迭代$key值总是显示"entry",因为XML对象没有分配一个数值,所有的部分都被称为"entry"。考虑:$xmlstr ="Title 1</title></entry>Title 2</title></entry>Title 3</title></entry></feed>";这样做:$content = SimpleXMLElement($xmlstr);和foreach($content->entry as $key=>$el) {$键将始终显示"entry",而不是任何可以识别单个条目的唯一索引。使用计数器变量是唯一的选择
你可以在你的foreach中放置一个hack,比如在每次运行时增加一个字段,这正是for循环在数字索引数组中给你的。这样的字段将是需要手动管理(增量等)的伪索引。
一个foreach将以$key值的形式给您提供索引,因此不需要这样的黑客攻击。
例如,在foreach中
1 2 3 4 5 6 7 8 9
| $index = 0;
foreach($data as $key=>$val) {
// Use $key as an index, or...
// ... manage the index this way..
echo"Index is $index
";
$index++;
} |
- 在循环中增加一个值很难算是"黑客"。
- @我们甚至可以说,它是循环的核心用途之一。
需要注意的是,您可以在任何数组上调用key()来查找当前的键。您可以猜测,current()将返回当前值,next()将把数组指针移动到下一个元素。
- 如果您想使用一个普通的旧PHP关联数组来存储要通过iterable接口公开的数据(您需要跟踪您在循环中的位置),那么这应该很有用。
- +1作为替代方法,但是每次迭代中的函数调用都比使用预先分配的变量(即使用来自$key=>$value的$key的变量)要重一些……不过,我敢打赌,在一个简单的循环中,较低的性能是不显著/不可察觉的。
欧文的回答很好。如果只需要键,并且正在使用数组,那么这也可能很有用。
1 2 3
| foreach(array_keys($array) as $key) {
// do stuff
} |
- 如果你需要索引,foreach(array_keys($array) as $index=>$key)。
您可以在循环外部创建$i,并在循环底部执行$i++。
- 需要注意的是,这种方法给出了循环的当前迭代,而不是迭代数组的当前索引。
这两个回路是等效的(当然,除了安全栏杆):
1 2 3
| for ($i=0; $i<count($things); $i++) { ... }
foreach ($things as $i=>$thing) { ... } |
如
1 2 3 4 5 6 7
| for ($i=0; $i<count($things); $i++) {
echo"Thing".$i." is".$things[$i];
}
foreach ($things as $i=>$thing) {
echo"Thing".$i." is".$thing;
} |
PHP数组有内部指针,请尝试以下操作:
1 2 3
| foreach($array as $key => $value){
$index = current($array);
} |
对我来说没问题(不过只是初步测试)。
乔纳森是对的。PHP数组充当映射表,将键映射到值。在某些情况下,如果定义了数组,则可以获取索引,例如
1 2 3 4 5 6
| $var = array(2,5);
for ($i = 0; $i < count($var); $i++) {
echo $var[$i]."
";
} |
你的输出将是
在这种情况下,数组中的每个元素都有一个已知的索引,但是如果您随后执行如下操作
1 2 3 4 5 6
| $var = array_push($var,10);
for ($i = 0; $i < count($var); $i++) {
echo $var[$i]."
";
} |
你得不到输出。这是因为PHP中的数组不像大多数语言那样是线性结构。它们更像哈希表,可能有也可能没有所有存储值的键。因此,foreach不使用索引来对它们进行爬网,因为只有在定义了数组的情况下,它们才具有索引。如果您需要一个索引,请确保在对数组进行爬行之前已完全定义了数组,并使用for循环。
- 是的,这就是为什么在PHP中,我们必须通过键而不是索引"连接数组"…另请参见数组映射(func,$a,$b)。
- ops,亲爱的reader和@thebrownyman,还请记住,您的示例类似于数组push()错误!!).建议使用$var[] = 10;(参见php link to guide),因此第二个for循环输出预期结果。
我认为最好的选择是一样的:
1 2 3
| foreach ($lists as $key=>$value) {
echo $key+1;
} |
这很容易而且正常
我想添加这个,我在Laravel中使用它只是索引我的表:
- 使用$loop->index
- 我还用++$循环将它预增量为从1开始
我的代码:
1 2 3 4 5
| @foreach($resultsPerCountry->first()->studies as $result)
<tr>
<td>{{ ++$loop->index}}</td>
</tr>
@endforeach |
1 2 3
| foreach(array_keys($array) as $key) {
// do stuff
} |
我通常在处理关联数组时这样做:
1 2 3
| foreach ($assoc_array as $key => $value) {
//do something
} |
这也适用于非关联数组。$key将是索引值。如果您愿意,也可以这样做:
1 2 3
| foreach ($array as $indx => $value) {
//do something
} |
- "备选方案"是什么?你知道这是一样的,除了变量名?所以最后一句话和代码块是不必要的,我想说-如果它做了什么,它只是混淆了。
- @丹尼斯98的区别在于,其中一个有一个关联数组作为输入,另一个有一个数字数组。虽然我想如果回答更详细一点会更好。
1 2 3
| foreach($arrvariable as $key=>$value){
echo"$key";
} |