【问题标题】:Get foreach numeric index when keys are named命名键时获取 foreach 数字索引
【发布时间】:2016-06-25 17:10:15
【问题描述】:

这个问题只是为了好玩和好奇。

编辑:我的问题不同于 How to find the foreach index 因为在我的例子中 $key 已经有一个非数字值了。

如果没有在 foreach 范围内递增的变量,就像通常的 $i 一样,有没有办法在 $key 已经命名时获取项目的索引?

例子:

$myNumericIndexArray = ('foo', 'bar', 'go', 'habs');

foreach($myNumericIndexArray as $key => $value){
    //Here $key will be 0 -> 1 -> 2 -> 3
}

现在,如果我有:

$myNamedIndexArray = ('foo' => 'bar', 'go' => 'habs', 'CSGO_bestTeam' => 'fnatic');

foreach($myNamedIndexArray as $key => $value){
    //Here $key will be foo -> go -> CSGO_bestTeam
}

我可以,而不必:

$i=0;
foreach($myNamedIndexArray as $key => $value){
    //Here $key will be foo -> go -> CSGO_bestTeam
    $i++;
}

访问命名数组的索引。在 foreach 声明中声明的内容,例如 for 或 $key 的状态?

祝你好运。

【问题讨论】:

  • 不,您不能在 foreach 构造中声明计数器变量。您可以使用 for 循环执行此操作,只需将键保存在数组中,然后您可以使用 counter 变量访问该数组。
  • 你的意思是访问关联数组中的数字索引?
  • 另外:foreach 没有自己的范围。 PHP 有函数作用域,你在 foreach 中声明的任何东西都可以在它之外使用。
  • @Drudge 是的,基本上在治疗时在钥匙上有一个计数器。无需在每次迭代时递增的范围之外声明计数器。这没有目标,真的,只是好奇是否有与此有关的整洁的东西

标签: php foreach


【解决方案1】:

如果你真的想要关联数组的索引数组而不是试试这个:

$myNamedIndexArray = ['foo' => 'bar', 'go' => 'habs', 'CSGO_bestTeam' => 'fnatic'];

$keys = array_keys($myNamedIndexArray);
foreach($myNamedIndexArray as $key => $value){
     echo array_search($key, $keys);
}

【讨论】:

  • 这正是我想要的。它保留命名索引并为您提供迭代项目的数字索引。完美的。谢谢。
  • 它可以工作,但是,为什么你要在每次循环迭代时执行 array_keys() 和 array_search() ???
  • 是的 同意,我们可以在单独的变量中获取密钥。我已经相应地更新了编码。
  • @RavindraBhalothia 我认为 OP 只想要密钥,那么为什么要在每次循环迭代中再次使用 array_search ?
  • @Drudge :我很想知道是否还有其他方法可以做到这一点。请告诉我们。
【解决方案2】:

我不知道您为什么要在每次循环迭代时执行array_keys()array_search()。只需构建一个引用数组,您仍然可以foreach()原始:

$positions = array_flip(array_keys($myNamedIndexArray));

foreach($myNamedIndexArray as $key => $value){
    echo "{$key} => {$value} is position {$positions[$key]}\n";
}

【讨论】:

  • 如果 PHP 以与 array_keys 相同的顺序对数组进行迭代,这将起作用。这是我没有的知识。有没有我可以阅读的文档?这将成为我最喜欢的答案,因为它服务于问题的主要目的,并且可以节省 CPU 周期。
  • 我不确定我是否理解这个问题。 array_keys() 将第一个键分配给索引 0,将第二个键分配给索引 1,依此类推。foreach() 重置数组指针并从数组的第一个元素开始。 $positions 数组和 $myNamedIndexArray 将始终匹配,除非您以某种方式修改它们。将任何数组插入其中,它会按预期工作。
  • stackoverflow.com/questions/4733188/… 这清除了我对 PHP 中 foreach 循环的理解。我更喜欢你的回答,谢谢。
  • 还有一些“轻”读:stackoverflow.com/questions/10057671/…
  • 是的!我实际上已经打开了标签。另外,真的很快,我是stackoverflow的新手,你知道为什么我的问题被否决了吗?没有像我这样的问题,我认为它的结构很好。是因为它不符合“现实世界的工作”目的吗?再次感谢。
【解决方案3】:

类似这样的:

<?php
$myNamedIndexArray = array('foo' => 'bar', 'go' => 'habs', 'CSGO_bestTeam' => 'fnatic');
$numericIndexArray = array_keys($myNamedIndexArray);
foreach($numericIndexArray as $key=>$value){
    echo $key.'</br>'; //here key will be 0 1 2
    echo $value. '</br>';
}

【讨论】:

  • 这可行。我选择了 Ravindra 的回答,但这也涵盖了我的问题。谢谢你的时间:)
  • 非常适合您。 :) 。如果此答案对您有用,请接受该答案,以便对其他人也有帮助。
【解决方案4】:

我会尝试这样的:

<?php

    $myNamedIndexedArray = ['foo' => 'bar', 'go' => 'habs', 'CSGO_bestTeam' => 'fnatic'];

    $myNumberIndexedArray = array_keys($myNamedIndexedArray);
    foreach($myNumberIndexedArray as $key => $value){
        echo $key. " => " . $myNamedIndexedArray[$myNumberIndexedArray[$key]]."<br />";
    }

?>

输出将是:

0 => bar
1 => habs
2 => fnatic

【讨论】:

  • 我同时收到了 Drudge 的回答和你的回答,而且是一样的。这证实了这一点。感谢您的宝贵时间。
  • 它发生了。有时我们会同时走同一条路。重要的是答案对您有所帮助。感谢您的支持。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
相关资源
最近更新 更多