[英]Grouping a 2D array according to its values
我一直试图让一些显示逻辑表现并保持它所属的位置,并且代码变成了一个有趣的小问题,这对于制定一个通用的解决方案来说是件好事。
忍受我,它看起来像一堵文字墙,但我试图用简单的示例数据很好地格式化它,所以在快速浏览之后它应该是可以理解的。
如果由于某种原因,整个事情是一个可怕的想法,我需要在我对众神造成侮辱之前说出来。
从这样的数据开始,例如:
$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;
}
我知道这已经过时了,但是当他们来到这里时,他想为其他人发布一个解决方案。
foreach($data as $row) {
$data_array[$row['city']][] = $row;
}
我原本试图对对象数组进行排序,因此无论如何我都要编写它,这是一个可以处理对象的对象,即使它是一个有点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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.