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

按键分组值,Foreach循环内的多维数组-PHP

  •  0
  • Bululu  · 技术社区  · 6 年前

    我将数据从MySQL拉入多维数组,我们称之为$notes。var\u dump($notes)提供如下内容:

    array (size=4)
      0 => 
        array (size=5)
          'id' => string '5' (length=1)
          'date' => string '2018-04-17 18:27:26' (length=19)
          'heading' => string 'Upcoming Event' (length=14)
          'name' => string 'The trip to Middleton has been cancelled' (length=40)
          'due_date' => string '2018-04-24' (length=10)
      1 => 
        array (size=5)
          'id' => string '7' (length=1)
          'date' => string '2018-04-17 18:30:49' (length=19)
          'heading' => string 'Special Offer' (length=13)
          'name' => string 'New Books in the Library. Get 20% discount if you buy before 29th April' (length=71)
          'due_date' => string '2018-04-29' (length=10)
      2 => 
        array (size=5)
          'id' => string '8' (length=1)
          'date' => string '2018-04-17 18:32:00' (length=19)
          'heading' => string 'Upcoming Event' (length=14)
          'name' => string 'There will be a PTA Meeting on 28th April 2018.' (length=47)
          'due_date' => string '2018-04-29' (length=10)
      3 => 
        array (size=5)
          'id' => string '3' (length=1)
          'date' => string '2018-04-17 16:43:44' (length=19)
          'heading' => string 'Warning' (length=7)
          'name' => string 'Please avoid illegal parking as that puts our members in danger.' (length=64)
          'due_date' => string '2018-07-24' (length=10);
    

    我有一个Foeach循环来处理数组。这里是我代码的相关部分。

    <?php
           foreach ($notes as $row) {
               echo '<h3>'.$row[heading].'</h3>';
               echo '<h3>'.$row[name].'</h3>';
            }
    ?>
    

    我得到的结果是:

    即将举行的活动

    去米德尔顿的旅行被取消了

    特别优惠

    图书馆的新书。享受八折优惠 如果您在4月29日之前购买

    即将举行的活动

    会有的 2018年4月28日召开PTA会议。

    警告

    请 避免非法停车,因为这会给我们的会员带来危险。

    如您所见,某些标题可能出现多次,在这种情况下,“即将到来的事件”标题下有两个项目。

    问题: 如何将标题相同的项目分组?在这种情况下,只有一个即将到来的事件标题,而这两个即将到来的事件是否位于该标题下?大约有8个标题可以使用。因此,如果每个项目都有一个唯一的标题,那么这些项目应该单独显示。例如,如果提交的所有笔记都在即将发生的事件下,则标题“即将发生的事件”应出现一次,在该标题下列出所有即将发生的事件。

    我认为除了array\u map之外,它还需要一些自定义函数,但我没能在这个方向上找到任何东西。请帮忙。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Uueerdo    6 年前

    如果您按标题对数组/结果进行排序,您应该能够只关注标题何时更改,如下所示:

    <?php
           $lastheading = 'some impossible string';
           foreach ($notes as $row) {
               if ($row[heading] != $lastheading)
                  echo '<h3>'.$row[heading].'</h3>';
               $lastheading = $row[heading];
               echo '<h3>'.$row[name].'</h3>';
            }
    ?>
    
        2
  •  1
  •   AliHA    6 年前

    你首先要做的是整理你的数据。首先要对数据分组。您可以通过排序来实现这一点。您可以创建自己的排序函数,然后使用usort函数。 之后,您必须检查最后一个标题,如果不一样,请打印。

    $arr = Array(0=>Array("id"=>"1",
                          "heading"=>"attack",
                          "name"=>"fire place"),
                 1=>Array("id"=>"2",
                          "heading"=>"dog",
                          "name"=>"second place"),
                 2=>Array("id"=>"3",
                          "heading"=>"attack",
                          "name"=>"he who climbs mountains")
        );
    usort($arr,function($a,$b) {
        return strcmp($a["heading"], $b["heading"]);
    });
    $lastHeading = "";
    foreach ($arr as $row) {
        if($lastHeading != $row["heading"])
            echo '<h3>'.$row["heading"].'</h3>';
        echo '<h5>'.$row["name"].'</h3>';
        $lastHeading = $row["heading"];
    }