Php 将MySQL查询结果拆分为多维数组
我从一个带有两个连接的MySQL查询中得到以下结果Php 将MySQL查询结果拆分为多维数组,php,mysql,arrays,multidimensional-array,split,Php,Mysql,Arrays,Multidimensional Array,Split,我从一个带有两个连接的MySQL查询中得到以下结果 Array ( [0] => Array ( [place_id] => 1 [place] => Berlin [lat] => 52.519 [lon] => 13.406 [id] => 1 [pname] => Firstschool [typ] => 0 [s_id] => 32 [fac] => history) [1] => Array ( [place_id
Array (
[0] => Array ( [place_id] => 1 [place] => Berlin [lat] => 52.519 [lon] => 13.406 [id] => 1 [pname] => Firstschool [typ] => 0 [s_id] => 32 [fac] => history)
[1] => Array ( [place_id] => 1 [place] => Berlin [lat] => 52.519 [lon] => 13.406 [id] => 1 [pname] => Secondschool [typ] => 0 [s_id] => 33 [fac] => math)
[2] => Array ( [place_id] => 1 [place] => Berlin [lat] => 52.519 [lon] => 13.406 [id] => 1 [pname] => Secondschool [typ] => 0 [s_id] => 33 [fac] => english)
)
数据在某些点上是冗余的,我需要这样做:
Array (
[Berlin] => Array ( [lat] => 52.519
[lon] => 13.406
[schools] => Array([0]=> Firstschool [1]=>Secondschool)
)
[OtherCity] => Array ( ... )
)
首先,这是可以的还是存在更好的解决方案?=)
第二如何将其拆分以获得所需的结果
我用下面的代码片段尝试了它,但它没有按预期工作
foreach($viewmodel as $item) {
$data[$item['place']][] = $item['pname'];
}
结果是:
Array ( [Berlin] => Array ( [0] => Firstschool [1] => Firstschool [2] => Firstschool ))
没那么有用
我希望我所需要的是可以理解的。也许有人对如何解决这个问题有很好的想法
谢谢您的时间。您是对的,您必须以某种方式迭代数组。从我看到的数组中,假设所有学校的所有纬度和经度都相同,覆盖不会有任何影响,否则,需要额外的逻辑
foreach($viewmodel as $item) {
$data[$item['place']['lat']=$item['lat'];
$data[$item['place']['long']=$item['lon'];
$data[$item['place']['schools'][]=$item['pname'];
}
我认为您走的是正确的道路,只需再补充一点细节:
$cities = Array (
Array ( 'place_id' => 1, 'place' => 'Berlin', 'lat' => 52.519, 'lon' => 13.406, 'id' => 1, 'pname' => 'Firstschool', 'typ' => 0, 's_id' => 32, 'fac' => 'history'),
Array ( 'place_id' => 1, 'place' => 'Berlin', 'lat' => 52.519, 'lon' => 13.406, 'id' => 1, 'pname' => 'Secondschool', 'typ' => 0, 's_id' => 33, 'fac' => 'math'),
Array ( 'place_id' => 1, 'place' => 'Berlin', 'lat' => 52.519, 'lon' => 13.406, 'id' => 1, 'pname' => 'Secondschool', 'typ' => 0, 's_id' => 33, 'fac' => 'english'),
);
// gather the transformed array in a new array
$out = array();
foreach ($cities as $city) {
// the first time we see the place
if (!isset($out[$city['place']])) {
// copy over what you want to keep
$out[$city['place']] = array(
'lat' => $city['lat'],
'lon' => $city['lon'],
'schools' => array($city['pname']),
);
} // only add $city['pname'] if we don't have it already
elseif (!in_array($city['pname'], $out[$city['place']]['schools'])) {
// we already seen this place, just add to the schools
$out[$city['place']]['schools'][] = $city['pname'];
}
}
对于聚集教员问题,请使用学校名称作为顶级数组“schools”键中数组的键,按如下方式填充它们:(仍跳过重复项):
如果使用的是PHP5.3+,则可以使用lambda函数映射数组
$output = array();
$sort_schools = function($value, $key)
{
if ( ! is_array($output[$value['place'])
{
$output[$value['place'] = array();
}
if ( ! isset($output[$value['place']['lat'] && ! isset($output[$value['place']]['lon'])
{
$output[$value['place']]['lat'] = $value['lat'];
$output[$value['place']]['lon'] = $value['lon'];
}
$output[$value['place']]['schools'][] = $value['pname'];
};
array_map($sort_schools, $viewmodel);
或者,您可以在foreach循环或匿名函数中的lambda函数中使用类似的结构。以下内容应产生所描述的预期结果
$arr = array(
array( 'place_id' => 1, 'place' => 'Berlin', 'lat' => 52.519, 'lon' => 13.406, 'id' => 1, 'pname' => 'Firstschool', 'typ' => 0, 's_id' => 32, 'fac' => 'history'),
array( 'place_id' => 1, 'place' => 'Berlin', 'lat' => 52.519, 'lon' => 13.406, 'id' => 1, 'pname' => 'Secondschool', 'typ' => 0, 's_id' => 32, 'fac' => 'history'),
array( 'place_id' => 1, 'place' => 'Berlin', 'lat' => 52.519, 'lon' => 13.406, 'id' => 1, 'pname' => 'Secondschool', 'typ' => 0, 's_id' => 32, 'fac' => 'history')
);
$result = array();
foreach($arr as $item) {
if (array_key_exists($item['place'], $result)) {
if (!in_array($item['pname'], $result[$item['place']]['schools'])) {
array_push($result[$item['place']]['schools'], $item['pname']);
}
} else {
$result[$item['place']]['lat'] = $item['lat'];
$result[$item['place']]['lon'] = $item['lon'];
$result[$item['place']]['schools'][] = $item['pname'];
}
}
print_r($result);
哪个应该输出
Array (
[Berlin] => Array
(
[lat] => 52.519
[lon] => 13.406
[schools] => Array
(
[0] => Firstschool
[1] => Secondschool
)
)
)
哇,谢谢。这很有效。但是我有一个小问题。现在这样,他给我的每一个结果的学校,即使这个学校已经提到。在这种情况下,我上了两次中学。我想我可以用if(!isset($out[$city['place']]['schools'])来阻止这一切,但是,我只得到了第一所学校,没有更多哦,我没意识到,更新了答案。事实上,有很多不同的方法可以做到这一点,补充了一个非常简单的方法。是的,谢谢。你的答案也很完美。=)谢谢你的帮助。作为一个额外的问题,是否可以将不同的课程类型(数学、历史……并不是每个学校都有相同的)作为子数组再次添加到学校中,那么树形维度呢?或者,就使用此数组而言,这是一个坏主意吗?=)当然,您可以使用
$city['pname']
和该键下的一个数组将$city['fac']
作为值,将数组添加到键中。但在这一点上,我认为对于原语来说,它有点毛茸茸的(-:@user2081104,我添加了一个实现。哈,这看起来很有魅力。我将对它进行一点测试,然后填充一些东西,稍后将其标记为我问题的解决方案。谢谢老兄。
Array (
[Berlin] => Array
(
[lat] => 52.519
[lon] => 13.406
[schools] => Array
(
[0] => Firstschool
[1] => Secondschool
)
)
)