通过Foreach循环内的Key,Multidimensional Array对值进行分组 - PHP

时间:2018-04-19 21:17:53

标签: php mysql arrays foreach array-map

我将数据从MySQL拉入多维数组,让我们称之为$ notes。 var_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>';
        }
?>

我得到类似的东西:

  

即将举行的活动

米德尔顿之旅已被取消

  

特别优惠

图书馆新书。享受20%的折扣   如果您在4月29日之前购买

即将举行的活动

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

警告

请   避免非法停车,因为这会使我们的成员处于危险之中。

正如您所看到的,有些标题可能不止一次出现,在这种情况下,标题下有2个项目“即将发生的事件”。

问题: 如何将具有相同标题的项目组合在一起?在这种情况下,只有一个即将举行的活动标题,并在该标题下有两个即将举行的活动?可以使用大约8个标题。因此,如果每个项目具有唯一标题,则应单独显示这些项目。例如,如果提交的所有Notes都在“即将发生的事件”下,那么“标题即将发生的事件”应该出现一次,其中列出了所有即将发生的事件。

我认为它需要一些自定义函数和array_map,但我没有想出任何方向。请帮忙。

2 个答案:

答案 0 :(得分:1)

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

<?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>';
        }
?>

答案 1 :(得分:1)

首先要做的是组织数据。您想先对数据进行分组。你这样做是通过排序。您可以使用自己的排序功能,然后使用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"];
}