PHP:合并多维数组,按特定键分组

时间:2014-09-02 08:14:19

标签: php mysql sql arrays group-by

我有一些像这样的数组:

array(
    'id' => 1,
    'title' => 'title1',
    'name' => 'name1',
    'count' => 2
)
array(
    'id' => 1,
    'title' => 'title1',
    'name' => 'name2',
    'count' => 3
)
array(
    'id' => 2,
    'title' => 'title2',
    'name' => 'name1',
    'count' => 2
)

我想合并它们,以便合并具有相同idtitle的数组。结果应该是:

array(
    'id' => 1,
    'title' => 'title1',
    'name' => array('name1', 'name2'),
    'count' => array(2, 3)
)
array(
    'id' => 2,
    'title' => 'title2',
    'name' => 'name1',
    'count' => 2
)

或者

array(
    'id' => 1,
    'title' => 'title1',
    'name' => 'name1, name2',
    'count' => '2, 3'
)
array(
    'id' => 2,
    'title' => 'title2',
    'name' => 'name1',
    'count' => 2
)

或者

array(
    'id' => 1,
    'title' => 'title1',
    'name1' => 2,
    'name2' => 3
)
array(
    'id' => 2,
    'title' => 'title2',
    'name1' => 2
)

array_merge_recursive()会扩展所有键,而不是分组。 (所有数组也可以是对象的形式。)

原始问题

实际上它是来自MySQL数据库的查询结果,我使用COUNTGROUP BYJOIN来生成上面的三个数组。由于所有MySQL查询都具有单行结构,并且查询结果不能包含子组类型,因此某些结果行具有相同的idtitle。现在我想用PHP处理这些结果。

如果你有更好的想法,请写出来。

1 个答案:

答案 0 :(得分:1)

这是代码

<?php

$data=array(array(
    'id' => 1,
    'title' => 'title1',
    'name' => 'name1',
    'count' => 2
),
array(
    'id' => 1,
    'title' => 'title1',
    'name' => 'name2',
    'count' => 3
),
array(
    'id' => 2,
    'title' => 'title2',
    'name' => 'name1',
    'count' => 2
));

$result=array();

foreach($data AS $item)
{
    $key=$item['id'].'_'.$item['title'];

    if(!isset($result[$key]))
    {
        $result[$key]=array(
            'id'=>$item['id'],
            'title'=>$item['title'],
            'name'=>array(),
            'count'=>array()
        );
    }

    $result[$key]['name'][]=$item['name'];
    $result[$key]['count'][]=$item['count'];
}

print_r($result);

这是结果

Array
(
    [1_title1] => Array
        (
            [id] => 1
            [title] => title1
            [name] => Array
                (
                    [0] => name1
                    [1] => name2
                )

            [count] => Array
                (
                    [0] => 2
                    [1] => 3
                )

        )

    [2_title2] => Array
        (
            [id] => 2
            [title] => title2
            [name] => Array
                (
                    [0] => name1
                )

            [count] => Array
                (
                    [0] => 2
                )

        )

)