根据其值对2D数组进行分组

时间:2010-10-12 18:00:26

标签: php arrays multidimensional-array grouping

我一直试图让一些显示逻辑表现并保持它所属的位置,并且代码变成了一个有趣的小问题,这对于制定通用解决方案会很好。

忍受我,它看起来像一面文字,但我试图用简单的示例数据很好地格式化它,所以在快速浏览之后它应该是可以理解的。

如果由于某种原因,这一切都是一个可怕的想法,我需要在我对众神造成侮辱之前说出来。

从这样的数据开始,例如:

$data = array(

    array(
        'name' => 'Dave',
        'age'  => '21',
        'city' => 'New York',
    ),
    array(
        'name' => 'Mike',
        'age'  => '19',
        'city' => 'Chicago',
    ),
    array(
        'name' => 'John',
        'age'  => '21',
        'city' => 'Chicago',
    ),
    array(
        'name' => 'Matt',
        'age'  => '19',
        'city' => 'New York',
    ),
    array(
        'name' => 'Luke',
        'age'  => '21',
        'city' => 'New York',
    ),

);

使用一组键名来对数据进行分组,例如

$groups = array('city', 'age);

然后数据变为:

$data = array(

    'New York' => array(
        '21' => array(
            array(
                'name' => 'Dave',
                'age'  => '21',
                'city' => 'New York',
            ),
            array(
                'name' => 'Luke',
                'age'  => '21',
                'city' => 'New York',
            ),
        ),
        '19' => array(
            array(
                'name' => 'Matt',
                'age'  => '19',
                'city' => 'New York',
            ),
        ),
    ),
    'Chicago' => array(
        '19' => array(
            array(
                'name' => 'Mike',
                'age'  => '19',
                'city' => 'Chicago',
            ),
        ),
        '21' => array(
            array(
                'name' => 'John',
                'age'  => '21',
                'city' => 'Chicago',
            ),
        ),
    ),
);

当我说“一般解决方案”时,我的意思是我正在尝试制作可以将事物分组到任何嵌套级别的内容,具体取决于您要求分组的关键名称的数量。

如果我只是知道一些随机的深奥的PHP语法,感觉就像我可以立即解决的那种问题。有什么建议?如果我在此期间弄明白的话,我会尝试更新这个。

3 个答案:

答案 0 :(得分:4)

function group_array($arr, $fields) {

    if(empty($fields) || !is_array($fields)) {
        return $arr;
    }

    $newarr = array(); // so that we always return an array
    $field = array_shift($fields);

    foreach($arr as $val) {
        $newarr[$val[$field]][] = $val;
    }

    foreach(array_keys($newarr) as $key) {
        // Since we shifted one field off before, this groups by the remaining
        $newarr[$key] = group_array($newarr[$key], $fields);
    }

    return $newarr;
}

答案 1 :(得分:3)

我知道这已经过时了,但是当他们来到这里时,他想为其他人发布一个解决方案。

foreach($data as $row) {
     $data_array[$row['city']][] = $row;
}

答案 2 :(得分:0)

我原本试图对对象数组进行排序,因为无论如何我都会写它,这是一个可以处理对象的对象,即使它只是一个有点hacky的想法

function group_objects($array, $fields)
{
    if (empty($fields) || !is_array($fields)) {
        return $array;
    }

    $newArray = array();
    $field    = array_shift($fields);

    foreach ($array as $object) {
        $key = call_user_func(array($object, 'get' . ucwords($field)));
        $newArray[$key][] = $object;
    }

    foreach (array_keys($newArray) as $key) {
        $newArray[$key] = group_objects($newArray[$key], $fields);
    }

    return $newArray;
}