上代码!!
public function search()
{
$data = '';
$district_table = District::tableName();
$url = 'https://restapi.amap.com/v3/config/district?parameters&key=67d98030aca29c4ea5671e21de0818ae&subdistrict=3';
$curl = new CurlHelper();
$res = json_decode($curl->get($url, json_encode($data)), true);
//省市区县
foreach ($res['districts'][0]['districts'] as $key => $value) {
//国下省
$pro[$value['adcode']]['adcode'] = $value['adcode'];
$pro[$value['adcode']]['name'] = $value['name'];
$pro[$value['adcode']]['level'] = $value['level'];
$pro[$value['adcode']]['center'] = $value['center'];
$pro[$value['adcode']]['citycode'] = $value['citycode'];
foreach ($value['districts'] as $k => $v) {
//省下的市
$city[$value['adcode']][$v['adcode']]['adcode'] = $v['adcode'];
$city[$value['adcode']][$v['adcode']]['name'] = $v['name'];
$city[$value['adcode']][$v['adcode']]['level'] = $v['level'];
$city[$value['adcode']][$v['adcode']]['center'] = $v['center'];
$city[$value['adcode']][$v['adcode']]['citycode'] = $v['citycode'];
//市下县区
foreach ($v['districts'] as $k1 => $v1) {
$district[$v['adcode']][$v1['adcode']]['adcode'] = $v1['adcode'];
$district[$v['adcode']][$v1['adcode']]['name'] = $v1['name'];
$district[$v['adcode']][$v1['adcode']]['level'] = $v1['level'];
$district[$v['adcode']][$v1['adcode']]['center'] = $v1['center'];
$district[$v['adcode']][$v1['adcode']]['citycode'] = $v1['citycode'];
}
}
}
$json_pro = array_column($pro, NULL, 'adcode');
$data_pro = array_column(District::find()->where(['parent_id' => 1])->asArray()->all(), NULL, 'adcode');
$json_pro_adcode = array_keys($json_pro);
$data_pro_adcode = array_keys($data_pro);
$adcode_same = array_intersect($json_pro_adcode, $data_pro_adcode); //对比数据库表和高德地图省差异
$adcode_diff = array_diff($json_pro_adcode, $data_pro_adcode);
//香港和台湾忽略
if ($adcode_diff) {
foreach ($adcode_diff as $pro_new_adcode) {
$lng_lat = explode(',', $pro[$pro_new_adcode]['center']);
$attributes[] = [1, 0,
$pro[$pro_new_adcode]['adcode'],
$pro[$pro_new_adcode]['name'],
$lng_lat[0],
$lng_lat[1],
$pro[$pro_new_adcode]['level'],
];
}
$query = \Yii::$app->db->createCommand();
$query->batchInsert(District::tableName(), ['parent_id', 'citycode', 'adcode', 'name', 'lng', 'lat', 'level',], $attributes)->execute();
} else {
//行政省不会改变,不处理!
}
//市处理
$data_pro_id = array_keys(array_column(District::find()->where(['parent_id' => 1])->asArray()->all(), NULL, 'id'));
foreach ($data_pro_id as $pro_id) {
$city_pro_adcode = District::find()->where(['id' => $pro_id])->one()['adcode']; //某省的adcode
$city_data = District::find()->where(['parent_id' => $pro_id])->asArray()->all(); //某省下的市
//print_r(array_keys($city[$city_pro_adcode]));die();
if (!empty($city_data)) {
foreach ($city_data as $city_one) {
if (!in_array($city_one['adcode'], array_keys($city[$city_pro_adcode]))) {
District::deleteAll('adcode=:adcode', [':adcode' => $city_one['adcode']]); //旧表有多余市!
District::deleteAll('parent_id=:parent_id', [':parent_id' => $city_one['id']]);//旧表有多余区县!
continue; //兼容旧district表
}
//$lng_lat_city=explode(',',$city[$city_pro_adcode][$city_one['adcode']]['center']); //经纬基本都不一样了,如果大批量更新可能会造成所表,后面考虑先在测试环境复制表过去在开启
if (
$city_one['adcode'] != $city[$city_pro_adcode][$city_one['adcode']]['adcode'] ||
$city_one['name'] != $city[$city_pro_adcode][$city_one['adcode']]['name'] ||
$city_one['citycode'] != $city[$city_pro_adcode][$city_one['adcode']]['citycode'] ||
$city_one['level'] != $city[$city_pro_adcode][$city_one['adcode']]['level']
// $city_one['lng']!=$lng_lat_city[0] ||
// $city_one['lat']!=$lng_lat_city[1]
) {
Yii::$app->db->createCommand()->update(District::tableName(),
[
'adcode' => $city[$city_pro_adcode][$city_one['adcode']]['adcode'],
'name' => $city[$city_pro_adcode][$city_one['adcode']]['name'],
'level' => $city[$city_pro_adcode][$city_one['adcode']]['level'],
'citycode' => $city[$city_pro_adcode][$city_one['adcode']]['citycode'],
//'lng'=>$lng_lat_city[0],
// 'lat'=>$lng_lat_city[1],
],
['id' => $city_one['id']])->execute();
}
}
} else {
//香港和台湾没市不处理
}
}
//区县处理
$data_pro_id = array_keys(array_column(District::find()->where(['parent_id' => 1])->asArray()->all(), NULL, 'id'));
foreach ($data_pro_id as $pro_id) {
$city_data = District::find()->where(['parent_id' => $pro_id])->asArray()->all(); //某省下的市
if (!empty($city_data)) {
foreach ($city_data as $city_one) { //某市下区县
$district_data = District::find()->where(['parent_id' => $city_one['id']])->asArray()->all();
//某市下的区县
$district_data_1 = District::find()->where(['parent_id' => $city_one['id']])->asArray()->all();
$district_data_new = array_keys(array_column($district_data_1, NULL, 'adcode')); //新增高德地图新返回区县
$json_district_data_new = array_keys($district[$city_one['adcode']]);
$adcode_diff_2 = array_diff($district_data_new, $json_district_data_new);
//print_r(gettype($adcode_diff_2));die();
if (!empty($adcode_diff_2)) {
District::deleteAll(['adcode' => $adcode_diff_2]);//旧表有多余区县!
}
$district_data_2 = District::find()->orderBy(['id' => 'DESC'])->asArray()->all();
$district_data_new_2 = array_keys(array_column($district_data_2, NULL, 'adcode'));
$adcode_diff_1 = array_diff($json_district_data_new, $district_data_new_2);
// print_r($adcode_diff_1);die();
if ($adcode_diff_1) {
foreach ($adcode_diff_1 as $pro_new_adcode_1) {
$lng_lat = explode(',', $district[$city_one['adcode']][$pro_new_adcode_1]['center']);
$sql = "INSERT INTO {$district_table}
(parent_id,citycode, adcode, name, lng, lat, level) VALUES
({$city_one['id']},'{$district[$city_one['adcode']][$pro_new_adcode_1]['citycode']}', '{$district[$city_one['adcode']][$pro_new_adcode_1]['adcode']}',
'{$district[$city_one['adcode']][$pro_new_adcode_1]['name']}',
'{$lng_lat[0]}',
'{$lng_lat[1]}',
'{$district[$city_one['adcode']][$pro_new_adcode_1]['level']}')";//P_MOD
// $res = $this->db->createCommand($sql)->execute();
// $attributes[] = [
// $city_one['id'],
// 0, //citycode
// $district[$city_one['adcode']][$pro_new_adcode_1]['adcode'],
// $district[$city_one['adcode']][$pro_new_adcode_1]['name'],
// $lng_lat[0],
// $lng_lat[1],
// $district[$city_one['adcode']][$pro_new_adcode_1]['level'],
// ];
$true = District::find()->where(['adcode' => $district[$city_one['adcode']][$pro_new_adcode_1]['adcode'], 'parent_id' => $city_one['id']])->one();
if (empty($true)) {
$res = \Yii::$app->db->createCommand($sql)->execute();
// $query = \Yii::$app->db->createCommand();
// $query->batchInsert(District::tableName(), ['parent_id', 'citycode', 'adcode', 'name', 'lng', 'lat', 'level',], $attributes)->execute();
}
}
}
foreach ($district_data as $district_one) {
if (!in_array($district_one['adcode'], array_keys($district[$city_one['adcode']]))) {
District::deleteAll('id=:id', [':id' => $district_one['id']]);//旧表有多余区县!
continue; //兼容旧district表
} //$lng_lat_city=explode(',',$district[$city_one['adcode'][$district_one['adcode']]['center']);
elseif (
$district_one['adcode'] != $district[$city_one['adcode']][$district_one['adcode']]['adcode'] ||
$district_one['name'] != $district[$city_one['adcode']][$district_one['adcode']]['name'] ||
$district_one['citycode'] != $district[$city_one['adcode']][$district_one['adcode']]['citycode'] ||
$district_one['level'] != $district[$city_one['adcode']][$district_one['adcode']]['level']
// $city_one['lng']!=$lng_lat_city[0] ||
// $city_one['lat']!=$lng_lat_city[1]
) {
Yii::$app->db->createCommand()->update(District::tableName(),
[
'adcode' => $district[$city_one['adcode']][$district_one['adcode']]['adcode'],
'name' => $district[$city_one['adcode']][$district_one['adcode']]['name'],
'level' => $district[$city_one['adcode']][$district_one['adcode']]['level'],
'citycode' => $district[$city_one['adcode']][$district_one['adcode']]['citycode'],
//'lng'=>$lng_lat_city[0],
// 'lat'=>$lng_lat_city[1],
],
['id' => $district_one['id']])->execute();
}
}
}
} else {
//香港台湾没市,不操作,超出配送范围
}
}
echo("AMAP API district update success!");
}
其中发现了个好用的函数