【问题标题】:Grouping PHP Array on 2 or more different values根据 2 个或更多不同的值对 PHP 数组进行分组
【发布时间】:2011-07-20 20:58:49
【问题描述】:

我正在创建一个最近的活动部分,并且我正在尝试对类似的项目进行分组。我希望能够根据活动的类型和活动的参与者对活动进行分组。例如:

Array
(
    [0] => Array
        (
            [user] => Bill
            [type] => photo
            [id] => 1
            [timestamp] => 12345678
        )

    [1] => Array
        (
            [user] => Joe
            [type] => photo
            [id] => 2
            [timestamp] => 12345678
        )

    [2] => Array
        (
            [user] => Bill
            [type] => comment
            [id] => 1
            [timestamp] => 12345678
        )

    [3] => Array
        (
            [user] => Bill
            [type] => photo
            [id] => 3
            [timestamp] => 12345678
        )

)

可以变成这样:

Array
(
    [0] => Array
        (
            [user] => Bill
            [type] => photo
            [items] => Array
                (
                    [0] => Array
                        (
                            [id] => 1
                            [timestamp] => 12345678
                        )

                    [1] => Array
                        (
                            [id] => 3
                            [timestamp] => 12345678
                        )

                )

        )

    [1] => Array
        (
            [user] => Joe
            [type] => photo
            [items] => Array
                (
                    [0] => Array
                        (
                            [id] => 2
                            [timestamp] => 12345678
                        )

                )

        )

    [2] => Array
        (
            [user] => Bill
            [type] => comment
            [items] => Array
                (
                    [0] => Array
                        (
                            [id] => 1
                            [timestamp] => 12345678
                        )

                )

        )

)

这几乎是我想要做的,但不完全是:Grouping arrays in PHP

有人有想法吗?

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    您的分组并不完全有意义(编辑后更有意义),试试这个:

    foreach ($activity as $data) {
       $newdata[$data['user']][$data['type']]['id'][]=$data['id'];
       $newdata[$data['user']][$data['type']]['timestamp'][]=$data['timestamp'];
    }
    

    编辑以反映您对所需输出的更改:(以及更有用的结构)

    foreach ($activity as $data) {
        $newdata[$data['user']][$data['type']]['items'][]=array('id'=>$data['id'],'timestamp'=>$data['timestamp']);
    }  
    

    编辑 2:

    您必须有某种密钥,在这种情况下,它是用户名和类型的组合。然后你必须重新索引它,以便它的数字如果这真的很重要。这应该非常接近您想要的:

    foreach ($activity as $data) {
            $key=$data['user'].'-'.$data['type'];
            $newdata[$key]['items'][]=array('id'=>$data['id'],'timestamp'=>$data['timestamp']);
            $newdata[$key]['user']=$data['user'];
            $newdata[$key]['type']=$data['type'];
    }
    $newdata=array_values($newdata);
    

    已测试:
    http://www.ideone.com/3uZdd

    编辑 3:

    单独的日期...这是让您开始的想法,为此您需要对原始数组做更多的事情。

    foreach ($activity as $data) {
            $key=$data['user'].'-'.$data['type'];
            $newdata[$key]['items'][$data['day']][]=array('id'=>$data['id'],'timestamp'=>$data['timestamp']);
            $newdata[$key]['user']=$data['user'];
            $newdata[$key]['type']=$data['type'];
    }
    $newdata=array_values($newdata);
    

    【讨论】:

    • 看起来不错,谢谢。但我最好让每个输出的动作(在分组之后)不是它的用户的孩子——基本上更像我的例子。
    • 它将输出如下内容:* Bill 添加了 2 张照片 * Joe 添加了第 1 张照片 * Bill 写了第 1 条评论
    • @ndog 再次更新。您的数据结构仍然没有意义,但这应该可以满足您的需求。
    • @ndog 我上次更新有一些问题,抱歉,现在已修复,经过测试,可以按照您的要求工作
    • 这看起来棒极了...现在,如果我要为此添加另一个级别的复杂性呢...仅将活动分组为 24 小时块。因此,如果比尔上周添加了一张照片,那么今天添加了 2 张。今天将被组合在一起,最后几周将是独立的?
    【解决方案2】:

    尝试将uasort 与按usertype 的值排序的自定义函数一起使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      相关资源
      最近更新 更多