php - 将 MySQL 查询结果拆分为多维数组

标签 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] => 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 ))

不太有用。 ;)

我希望它可以理解我的需要。也许有人有一个好主意如何解决这个问题。

感谢您的宝贵时间。

最佳答案

我认为您走在正确的道路上,只需填写更多细节:

$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'];
    }
}
<小时/>

对于收集院系的问题,请使用学校名称作为顶级数组的“学校”键中数组的键,如下所示填充它们:(仍然跳过重复项):

foreach ($a as $city) {
    if (!isset($out[$city['place']])) {
        $out[$city['place']] = array(
            'lat' => $city['lat'],
            'lon' => $city['lon'],
            'schools' => array($city['pname'] => array($city['fac'])),
        );
    } else {
        // for convenience and readability, introducing some variables
        $schools = &$out[$city['place']]['schools'];
        $pname = $city['pname'];
        $fac = $city['fac'];

        // if we didn't see this school yet, add it with it's faculty
        if (!isset($schools[$pname])) {
            $schools[$pname] = array($fac);
        } // if we did see this school before but the faculty is new, add it under the school's key
        else if (!in_array($fac, $schools[$pname])) { 
            $schools[$pname][] = $fac;
        }
    }
}

关于php - 将 MySQL 查询结果拆分为多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14925191/

相关文章:

mysql - 如何在命令行中使用执行mysqldiff实用程序?

c++ - 在 C++ 中设置 array1 = array2

c++ - 如何在Arduino/C/C++中将带有 bool 值的数组转换为字节?

javascript - 在不使用 jquery 的情况下检查是否选中了复选框?

php - CakePHP 和 Phonegap,它们可以一起使用吗?

php - 在php中指定时间后强制注销

php - Session 可以用来存储安全信息吗?

php - 执行邻近搜索的路线图

mysql - 与 mysql 的内连接不起作用

java - 在java中将byte[]数组从MySQL转换为带有破折号的十六进制?