代码之家  ›  专栏  ›  技术社区  ›  Maxcot

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

  •  0
  • Maxcot  · 技术社区  · 12 年前

    我试图从下面的数组中生成一个按“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 => 
          ...
    

    所以我想制作一个类似于伪列表的东西:

    • 组名称
      • 文本
      • 文本
      • 文本
    • 下一组名称
      • 文本
      • 文本 ...

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

    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>";
    }
    

    但我收到了关于“next()期望参数1是数组,字符串给定”的错误。

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

    3 回复  |  直到 12 年前
        1
  •  1
  •   Alexander Gelbukh    12 年前

    你误解了函数的含义 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 循环关键地取决于数组指针的值,搞乱数组指针会破坏循环:您可能会看到循环中的每一个第二个元素,因为每次迭代都会出现一次 next() 由您的 前肢 循环,然后自己一次。

    对你来说最简单的事情可能就是使用旧的好东西 for 循环:

    for ($i = 0; $i < length ($array); $i++)
    {
        if ($i == 0 || $array[$i] != $array[$i - 1])
            echo "New group!\n";
    
        echo $array[$i];
    }
    
        2
  •  1
  •   billyonecan    12 年前

    这并不能直接回答您的问题,但您最好重新构建阵列,以便对它们进行分组,并且不需要在循环中执行任何逻辑来检查 groupName 。目前,您依赖的是 组名称 以匹配当前 组名称 ,但如果它们不是顺序的,就不会分组。

    你可以这样做:

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

    Here's a demo

        3
  •  0
  •   deceze    12 年前

    您不应使用 next 内部 foreach 循环,因为您将得到冲突的数组指针移动。仅仅 存储最后一个 值:

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