在多维数组中foreach循环中的奇怪行为

时间:2014-04-27 16:03:55

标签: php multidimensional-array foreach

问题

为什么带有"l++;"的行会影响foreach循环的循环计数?那条线只是作为一个计数器,但不知何故它影响了最终结果。

有人可以帮忙解释一下这里发生了什么吗?

代码

我有以下多维数组:

$team_array = array(
    array(68, 6, 0, 10, "1.000"),
    array(72, 6, 0, 10, "1.000"),
    array(65, 6, 0, 8, "1.000"),
    array(62, 6, 0, 4, "1.000"),
    array(54, 3, 3, 3, ".500"),
    array(55, 3, 3, -5, ".500"),
    array(59, 0, 6, -16, ".000")
);

我使用以下代码循环遍历数组。

$foo = "1.000";    
$k = 0;
$l = 0;
$m = 0;
$n = 0;
foreach($team_array as $index => $inner_arr)
{
    foreach($inner_arr as $value)
    //echo $value.", ";
    //echo "<br/>";
    $l++;
    { 
        $m++;
        echo "index - $index<br>";
        echo "perc = ".$team_array[$index][4]."<br>";
        if ($team_array[$index][4] == $foo)
        {
            $tie_tm[] = $team_array[$index][0];
            $n++;
        }   

    }

    $k++;
}
echo "k - $k<br>";
echo "l - $l<br>";
echo "m - $m<br>";
echo "n - $n<br>";

echo "<pre>";
print_r($tie_tm);

我已经将调试位留在了,因为它们显示了奇怪的(对我而言)行为。具体来说,如果我注释掉"l++;"行,我会得到比我预期更多的循环。在没有"l++;"行的情况下运行此代码可以为我提供:

k - 7
l - 0
m - 35
n - 20
Array
(
[0] => 68
[1] => 68
[2] => 68
[3] => 68
[4] => 68
[5] => 72
[6] => 72
[7] => 72
[8] => 72
[9] => 72
[10] => 65
[11] => 65
[12] => 65
[13] => 65
[14] => 65
[15] => 62
[16] => 62
[17] => 62
[18] => 62
[19] => 62
)

随着它离开,我得到:

k - 7
l - 35
m - 7
n - 4
Array
(
[0] => 68
[1] => 72
[2] => 65
[3] => 62
)

这是我想要和期望的结果。

最后,我需要的是我在最终结果中获得的数组中的4个元素。我想删除调试位,但需要了解我可能需要更改此代码以保持最终结果。

提前致谢!

4 个答案:

答案 0 :(得分:1)

删除foreach标题和左大括号之间的代码。

你无意中做的是创建一个实际上像这样工作的foreach循环

foreach($inner_arr as $value) 
    $l++;

当你想要的是一个看起来像这样的foreach循环

foreach($inner arr as $value) {
    // all your looping code should go in between the curly braces 
    // and the curly braces need to immediately follow the foreach header (with nothing in between)
}

答案 1 :(得分:1)

您已将l++放在第二个foreach及其对应的{}之间。因此,除了在{}之间预测代码之外,您只需要预约l++。尝试将l++放在第二个foreach之前或相应的{}内。

答案 2 :(得分:1)

重新编写代码。试试 -

$team_array = array(
        array(68, 6, 0, 10, "1.000"),
        array(72, 6, 0, 10, "1.000"),
        array(65, 6, 0, 8, "1.000"),
        array(62, 6, 0, 4, "1.000"),
        array(54, 3, 3, 3, ".500"),
        array(55, 3, 3, -5, ".500"),
        array(59, 0, 6, -16, ".000")
      );

$result = array();
for($i=0; $i<4; $i++)
{
    $result[] = $team_array[$i][0];
}

print_r($result);


输出

Array
(
   [0] => 68
   [1] => 72
   [2] => 65
   [3] => 62
)


DEMO

http://3v4l.org/RJu69#v430

答案 3 :(得分:0)

感谢您的快速反馈。我非常感谢!!!

这些答案让我意识到内在的foreach循环对我来说真的没有任何作用。我只对查看多维数组的单个指定维度感兴趣,并且在不使用内部foreach循环的情况下获得了我想要的结果。

我修改了代码如下:

$foo = "1.000";
$m = 0;
$n = 0;
foreach($team_array as $index => $inner_arr)
{
    $m++;
    echo "index - $index<br>";
    echo "perc = ".$team_array[$index][4]."<br>";
    if ($team_array[$index][4] == $foo)
    {
        $tie_tm[] = $team_array[$index][0];
        $n++;
     }   
}

echo "m - $m<br>";
echo "n - $n<br>";


echo "<pre>";
print_r($tie_tm);

再次......感谢所有反馈。这个社区真是太棒了!