如何在多维数组中获取下一个值

时间:2014-07-14 09:41:19

标签: php arrays multidimensional-array

我正在尝试制作一个按" groupName"分组的HTML列表。来自下面的数组。

array (size=30)
  0 => 
    array (size=4)
      'groupOrder' => string '1' (length=1)
      'groupName' => string 'Class' (length=11)
      'txt' => string '............' (length=32)
      'ID' => string '6' (length=1)
  1 => 
    array (size=4)
      'groupOrder' => string '1' (length=1)
      'groupName' => string 'Size' (length=11)
      'txt' => string '..................' (length=34)
      'ID' => string '6' (length=1)
  2 => 
      ...

所以我想制作像这样的伪列表:

  • 组名
    • TXT
    • TXT
    • txt
  • 下一个GroupName
    • TXT
    • TXT ...

所以我的代码看起来像这样

foreach ($datafeed as $val => $row) {
       if (($datafeed[$val]['groupName']) == next($datafeed[$val]['groupName'])) {
           //same group - do nothing
       } else {
            echo $datafeed[$val]['groupName'];
       }

       echo "<li>".$row['txt']. "</li>";
}

但我收到错误&#34; next()期望参数1为数组,字符串为&#34;。

我尝试过各种不同的语法,但我没有取得多大进展。如何比较嵌套数组中的两个值?

3 个答案:

答案 0 :(得分:1)

您误解了函数next()的含义:您无法查询数组元素。它操纵与数组本身绑定的内部数组指针,而不是它的一些元素。来自the PHP documentation

Every array has an internal pointer to its "current" element, which is initialized to the first element inserted into the array. 

另见a description of next

由于foreach循环关键取决于数组指针的值,弄乱数组指针会破坏循环:你可能会看到循环中的每个第二个元素,因为每次迭代都会{{1}你的next()循环调用,然后自己调用一次。

最简单的事情可能是使用旧的foreach循环:

for

答案 1 :(得分:1)

这不会直接回答您的问题,但您最好重新组合阵列,以便将它们分组,并且您不需要在循环内执行任何逻辑来检查groupName 。目前,您依靠下一个groupName来匹配当前的groupName,但如果它们不是连续的,则不会对它们进行分组。

你可以这样做:

$output = array();
foreach ($datafeed as $feed) {
    $output[$feed['groupName']][] = $feed;
}

Here's a demo

答案 2 :(得分:0)

你不应该在next循环中使用foreach,因为你会得到冲突的数组指针移动。只需存储最后的值:

$last = null;
foreach (...) {
    if ($last != $row['current']) {
        // new group
    }
    $last = $row['current'];
    ...
}