【问题标题】:PHP - Group Array by a Dynamic number of KeysPHP - 通过动态数量的键对数组进行分组
【发布时间】:2016-07-07 11:33:30
【问题描述】:

我正在尝试使用 PHP 对具有动​​态生成的键数的数组进行分组。

我的查询输出如下内容:

| employee   | SkillA     | SkillB     |
 ------------+------------+------------
| Person One | 2015-05-04 | -          |
| Person One | -          | 2016-05-01 |
| Person Two | -          | 2016-03-25 |
| Person Two | 2016-04-04 | -          |

它是由如下所示的数组构建的:

Array ( 
    [0] => Array ( 
        [id] => 1001675 
        [employee] => Person One 
        [SkillA] => 2015-05-04 
        [SkillB] => NULL
    ) 
    [1] => Array ( 
        [id] => 1001675 
        [employee] => Person One 
        [SkillA] => NULL 
        [SkillB] => 2016-05-01 
    )
    [2] => Array ( 
        [id] => 1006111 
        [employee] => Person Two 
        [SkillA] => NULL 
        [SkillB] => 2016-03-25 
    ) 
    [3] => Array ( 
        [id] => 1006111 
        [employee] => Person Two 
        [SkillA] => 2016-04-04 
        [SkillB] => NULL 
    ) 
)

但我需要显示这个:

| employee   | SkillA     | SkillB     |
 ------------+------------+------------
| Person One | 2015-05-04 | 2016-05-01 |
| Person Two | 2016-04-04 | 2016-03-25 |

这意味着我的数组需要如下所示:

Array ( 
    [0] => Array ( 
        [id] => 1001675 
        [employee] => Person One 
        [SkillA] => 2015-05-04 
        [SkillB] => 2016-05-01
    ) 
    [1] => Array ( 
        [id] => 1006111 
        [employee] => Person Two 
        [SkillA] => 2016-04-0
        [SkillB] => 2016-03-25 
    ) 
)

我尝试通过在 MySQL 中使用 GROUP BY 来做到这一点(请参阅这个问题 MySQL - Dynamic Pivot Table Grouping Issue)。但是失败了,我决定尝试与 PHP 组合。

关于“PHP 数组分组”有很多这样的问题,但似乎没有一个完全符合我的需要。问题是数组键是动态生成的。它们将始终包含[id][employee],但后面跟着数量不定的“[skill]”键。

我用它来获取标题的名称:

// We don't know the names of the headers 
// so loop through all of the array keys to get them

$headers = array();

while ($key = current($data[0])) {
    $header = key($data[0]);
    array_push($headers, $header); // add the header to an array for later use
    echo '<th>' . $header . '</th>'; // write the headers to the table
    next($data[0]);
}

所以我想我可以做这样的事情来获取我需要的数据:

$arr = array();

foreach ($data as $key => $item) {
    foreach ($headers as $header) {
        $arr[$item['employee']][$header] = $item;
    }
}

但它没有生成所需格式的数组。

【问题讨论】:

  • 专注于使用 MySQL。没那么复杂。
  • Person One 包含三个记录,其中一个SkillA(2015-05-04) 和多个SkillBSkillC 填充值时,它应该如何分组?
  • 我的查询中的 ORDER BYGROUP BY 将阻止任何“技能”的多个值 - 它只会获取每个值的最新“技能日期”

标签: php mysql arrays


【解决方案1】:

让我们回到 MySQL 查询

select employee, max(SkillA) SkillA, max(SkillB) SkillB 
from t 
group by employee

t 更改为您的查询

【讨论】:

  • 这是一个有趣的想法,但 max(SkillA) SkillA, max(SkillB) SkillB 需要动态生成,仅包含我查询中的技能标题。
【解决方案2】:

既然每个人的ID都是一样的,为什么不把它当作数组键呢?

$query = your_database_query;

$aQueryResult = array ( );

while ( $aFetch = mysql_fetch_assoc ( $query ) )
{
    if ( isset ( $aQueryResult[$aFetch['id']] ) )
    {
        $aQueryResult[$aFetch['id']] = array_merge ( array_filter ( $aQueryResult[$aFetch['id']] ), array_filter ( $aFetch ) );
    }
    else
    {
        $aQueryResult[$aFetch['id']] = $aFetch;
    }
}

print_r ( $aQueryResult );

这样,你拥有多少技能领域并不重要。

编辑: array_filter 删除 NULL 值,array_merge 将两个数组合并在一起。

【讨论】:

    猜你喜欢
    • 2020-10-21
    • 1970-01-01
    • 2023-03-24
    • 2018-02-20
    • 2015-11-04
    • 2016-01-24
    • 1970-01-01
    • 2019-05-08
    • 2022-01-11
    相关资源
    最近更新 更多