【问题标题】:PHP foreach loop through multidimensional array echo output group by one key->valuePHP foreach 通过一个键->值循环遍历多维数组回显输出组
【发布时间】:2017-03-12 17:10:05
【问题描述】:

我有一个多维数组:

 Array
(
    [0] => Array
        (
            [place_id] => 2225
            [place_name] => NEW YORK
            [alarm] => PING
            [name_connection] => New-York-01
            [name_connection_id] => 11175
            [status] => 1
        )
    [1] => Array
        (
            [place_id] => 2225
            [place_name] => NEW YORK
            [alarm] => PING
            [name_connection] => New-York-03
            [name_connection_id] => 4324
            [status] => 1

        )   
    [2] => Array
        (
            [place_id] => 1345
            [place_name] => DALLAS
            [alarm] => PING
            [name_connection] => Dallas-03
            [name_connection_id] => 6666
            [status] => 1

        )       

)

如果我使用 foreach,我会得到输出,但如果它们相同,我希望得到按第一个键值或第二个键值(place_id 或 place_name)分组的输出。所以基本上我想得到这样的输出:

纽约
纽约-01 | 11175 | 1
纽约-03 | 4324 | 1
达拉斯
达拉斯-03 | 6666 | 1

如果我使用标准 foreach:

 foreach($place as $rowplace){

            $place_name3 = $rowplace['place_name'];
            $name_connection3 = $rowplace['name_connection'] ;

            echo' 
            <font color="green"> <b>'.$place_name3 .'</b><br> 
'.$name_connection3.'</font> <br>'; 
            }

我痛风输出是这样的:

纽约
纽约-01 | 11175 | 1
纽约
纽约-03 | 4324 | 1
达拉斯
达拉斯-03 | 6666 | 1

所以 NEW YORK (place_name) 是重复的。如何根据该键值对结果进行合并或分组?

谢谢,米斯科

【问题讨论】:

    标签: php arrays multidimensional-array foreach


    【解决方案1】:

    一些基本的解决方案是跟踪place_name 并查看它是否已更改:

    // variable to track previous place name
    $prev_place_name = '';
    
    foreach($place as $rowplace){
        $place_name3 = $rowplace['place_name'];
    
        // current place name differs from previous:
        if ($place_name3 != $prev_place_name) {
            echo '<font color="green"> <b>'.$place_name3 .'</b></font>';
            $prev_place_name = $place_name3;
        }
    
        $name_connection3 = $rowplace['name_connection'] ;
        echo '<br>'.$name_connection3; 
    }
    

    【讨论】:

    • 未来的读者,如果你的子数组不是按place_name排序的,在循环之前调用usort()准备数组。
    【解决方案2】:

    您需要使用旧地名添加一个新变量,检查它是否 == 您的数组中的 place_name,是否不回显地名,是否仅回显连接

    编辑:这也意味着您必须按地名顺序排列,例如纽约、纽约、达拉斯,而不是纽约、达拉斯、纽约。但既然你的数组已经这样设置了,你应该没问题。

    【讨论】:

      【解决方案3】:

      使用额外的分组“地点”数组完成解决方案(通过place_name 键):

      $places = [
          [
              'place_id' =>  2225,
              'place_name' =>  'NEW YORK',
               'alarm' =>  'PING',
               'name_connection' =>  'New-York-01',
               'name_connection_id' =>  11175,
               'status' =>  1,
          ],
          [
              'place_id' =>  2225,
              'place_name' =>  'NEW YORK',
              'alarm' =>  'PING',
              'name_connection' =>  'New-York-03',
              'name_connection_id' =>  4324,
              'status' =>  1,
          ],
          [
              'place_id' =>  1345,
              'place_name' =>  'DALLAS',
              'alarm' =>  'PING',
              'name_connection' =>  'Dallas-03',
              'name_connection_id' =>  6666,
              'status' =>  1,
          ]
      ];
      
      $grouped = [];
      foreach ($places as $place) {
          // constructing the row with columns
          $line = implode("|", [$place['name_connection'], $place['name_connection_id'], $place['status']]);
          if (isset($grouped[$place['place_name']])) {
              $grouped[$place['place_name']] .= "</br>". $line;
          } else {
              $grouped[$place['place_name']] = $line;
          }
      }
      
      // outputting `places` data in tabular form
      foreach ($grouped as $k => $columns) {
          echo '<font color="green"> <b>'. $k .'</b></br>'
                  . $columns .'</font> </br>';
      }
      

      输出(当然,在浏览器中你会看到粗体/彩色文本):

       NEW YORK
      New-York-01|11175|1
      New-York-03|4324|1 
       DALLAS
      Dallas-03|6666|1 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-21
        • 2011-01-02
        相关资源
        最近更新 更多