2010-10-12 51 views
3

我一直在试图让一些显示逻辑行为并保持它所属的位置,并且代码已经变成了一个有趣的小问题,很适合做一个通用的解决方案。按照它的值分组一个二维数组

熊与我,它看起来像一堵文字,但我试图用简单的示例数据很好地格式化,所以它应该可以通过快速浏览后可以理解。

如果由于某种原因,这整件事是一个可怕的想法,我需要告诉我之前,我创造了一个侮辱众神。

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

$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语法深奥的一点。有什么建议么?我会尝试更新这个是如果我在这段时间弄清楚的。

回答

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

该死的男人,这正是我所说的。我看到你的小忍者编辑也停止无限递归,很好!从字面上来看,需要改变的唯一一件事是为了=> foreach而完成。这意味着你甚至没有测试这个来捕捉语法错误,而实际的复杂部分是第一次。我敬畏。 – Henry 2010-10-12 18:10:17

+0

嘿,我最近一直在和Python一起工作,所以我忘了让它们成为'foreach'。现在修复。 – Amber 2010-10-12 18:17:53

0

我本来试图对象数组等等,因为我要去写也无妨,这里的一个对象上的作品进行排序,哪怕是一个稍微哈克想法

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

我知道这已经很老了,但是当他们想要为他人提供一个解决方案时,

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