Php 根据二维数组的值对其进行分组

Php 根据二维数组的值对其进行分组,php,arrays,multidimensional-array,grouping,Php,Arrays,Multidimensional Array,Grouping,我一直在尝试让一些显示逻辑正常运行并保持在它所属的位置,而代码已经变成了一个有趣的小问题,最好能为它提供一个通用的解决方案 请容忍我,它看起来像是一堵文字墙,但我已经尝试用简单的示例数据对其进行良好的格式化,以便在快速浏览之后可以理解 如果出于某种原因,这整件事是一个可怕的想法,我需要在冒犯神之前告诉他 从这样的数据开始,例如: $data = array( array( 'name' => 'Dave', 'age' => '21',

我一直在尝试让一些显示逻辑正常运行并保持在它所属的位置,而代码已经变成了一个有趣的小问题,最好能为它提供一个通用的解决方案

请容忍我,它看起来像是一堵文字墙,但我已经尝试用简单的示例数据对其进行良好的格式化,以便在快速浏览之后可以理解

如果出于某种原因,这整件事是一个可怕的想法,我需要在冒犯神之前告诉他

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

$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语法,我就可以立即解决这类问题。有什么建议吗?我会尝试更新它,如果我能同时弄清楚的话。

我最初尝试对对象数组进行排序,所以既然我要写它,这里有一个对对象有效的方法,即使这是一个有点粗糙的想法

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;
}
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;
}

我知道这已经很老了,但我想在其他人遇到这个问题时为他们发布一个解决方案

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

该死的,这正是我要说的。我看到你的小忍者编辑停止无限递归太好了!从字面上说,唯一需要更改的是for=>foreach,这样就完成了。这意味着您甚至没有通过测试来捕捉语法错误,而实际的复杂部分第一次是正确的。我很敬畏。嘿,我最近一直在使用Python,所以我忘了为每个人制作
foreach
。现在修好了。