【问题标题】:split an array into groups every time there is a different group_id number in php每次在 php 中有不同的 group_id 编号时,将数组分成组
【发布时间】:2018-04-21 02:08:38
【问题描述】:

一个从数据库中排序的动态数组,它有一些类似的组 id 和一些不同的组 id,如下所示:

 $sourcearray = array(
 array(id => 1  , value => 'text'),
 array(id => 1  , value => 'text'),
 array(id => 1  , value => 'text'),
 array(id => 1  , value => 'text'),

 array(id => 2  , value => 'text'),
 array(id => 3  , value => 'text'),

 array(id => 4  , value => 'text'),
 array(id => 4  , value => 'text')
 );

我想将它们分成具有相同组 ID 的组 类似的东西:

 $group1 = array(
 array(id => 1  , value => 'text'),
 array(id => 1  , value => 'text'),
 array(id => 1  , value => 'text'),
 array(id => 1  , value => 'text')
 );

 $group2 = array(
  array(id => 2  , value => 'text')
 );    

 $group3 = array(
  array(id => 3  , value => 'text')
 ); 

 $group4 = array(
  array(id => 4  , value => 'text'),
  array(id => 4  , value => 'text')
 ); 

此 ID 不是唯一的,并且此安排和组 ID 不是静态的,它们可能会有所不同,具体取决于网站管理面板设置

【问题讨论】:

  • 数组上不能有多个元素具有相同的键。
  • 抱歉,这些在 PHP 中根本不存在(源数组永远不会像那样)。键和索引是唯一的。 PHP 只会保留最后一个定义。
  • 对不起,我忘了告诉你这是来自数据库的结果,这些键被注册为 group_id 并且它不是唯一的,我将编辑我的问题,非常抱歉造成混乱跨度>
  • 你确定不是$sourcearray = array( array(1 => 'value'),之类的吗?
  • @Don'tPanic ,是的,我很困惑,赶紧写这个问题,我现在编辑它,谢谢你提醒我:)

标签: php


【解决方案1】:

我建议这样做的方法是在从查询中获取行时,使用要分组的特定列作为键将结果分组到一个数组中。

while ($row = $query->fetch()) {
    $result[$row['id']][] = $row;
}

这将产生如下结果:

$groups = [
    1 => [
        ['id' => 1, 'value' => 'text'],
        ['id' => 1, 'value' => 'text'],
        ['id' => 1, 'value' => 'text'],
        ['id' => 1, 'value' => 'text']
    ],
    2 => [
        ['id' => 2, 'value' => 'text']
    ],
    3 => [
        ['id' => 3, 'value' => 'text']
    ],
    4 => [
        ['id' => 4, 'value' => 'text'],
        ['id' => 4, 'value' => 'text']
    ]
];

这将比每个组的单独变量更容易使用。

【讨论】:

    【解决方案2】:

    您可以使用reduce 将日期汇总到关联数组中。您可以使用extract 将变量从数组导入到当前符号表中

    $sourcearray = array(
         array("id" => 1  , "value" => 'text'),
         array("id" => 1  , "value" => 'text'),
         array("id" => 1  , "value" => 'text'),
         array("id" => 1  , "value" => 'text'),
         array("id" => 2  , "value" => 'text'),
         array("id" => 3  , "value" => 'text'),
         array("id" => 4  , "value" => 'text'),
         array("id" => 4  , "value" => 'text')
    );
    
    $result = array_reduce($sourcearray, function($c, $v){
        $c[ 'group' . $v['id'] ][] = $v;
        return $c;
    }, array());
    
    extract($result);  //Optional. If you want to use variable like $group1, $group2 etc
    

    现在您可以使用$group1$group2

    文档:array_reduceextract

    【讨论】:

    • 赞成按原样回答问题,而不是像我那样表达您的意见
    • 回答也不错。请注意 extract() 默认使用 EXTR_OVERWRITE 并最终可能会覆盖现有变量。
    【解决方案3】:

    正如其他人在 cmets 中指出的那样,您不能在 PHP 中拥有一个包含重复键的数组。最后一个关键属性将覆盖之前的属性。这个answer 可能会帮助您找到替代方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多