在网站开发过程中,很多情况下都要用到省市(区)二级联动下拉菜单,比如地址信息,以及天气等API接口调用,等等,而且具有通用性,一次入库,到处使用,前面农夫庄园相关文章提到过该方法,但是网上找到的省市信息比较坑,很多将县一级的城市也列到区市里,后面还要删除,比较麻烦,后来在测试天气API的时候,找到一个更好的json格式的省市信息,应该是比较准确了,这里将相关代码列出如下,希望给大家提供帮助:

首先需要下载我提供的包含json格式省市信息的文件:sxinfo.txt

然后将该文件中的json格式数据拷贝到下面代码中相应的位置(或者你也可以从文件流中读取省市信息到字符串中,然后进行处理,这里不赘述):

<?php

/*
* author:农夫庄园
* website:
* url:/p/5543.html
*/

//json格式的地区字符串
$area = <<<AREA
这里插入json格式省市信息
AREA;

//将json格式的地区字符串转化为数组,不加参数true则会转化为对象
$area_array = json_decode($area, true);
//echo '<pre>';
//print_r($area_array);

$areas = $area_array['areas'];

$pdo = new PDO('mysql:host=localhost;dbname=dbname;charset=utf8', 'user', 'pass'); //将相应位置替换成你的数据库对应信息
//开启事务支持
$pdo->beginTransaction();

foreach ($areas as $area):
    //echo '省/直辖市:'.$area['省'].'<br/>';
    $province = $area['省'];
    $stmt = $pdo->prepare("INSERT INTO province(`name`) VALUES(:name)");
    $stmt->bindParam(':name', $province);
    if ($stmt->execute()) {
        $cities = $area['市'];
        foreach ($cities as $city) {
            //echo '|---市/区/自治州:'.$city['编码'].'-'.$city['市名'].'<br/>';
            $cid = $city['编码'];
            $name = $city['市名'];

            //查询省份id[province表中的name是唯一的]
            $query = $pdo->prepare("SELECT id FROM province WHERE name = '".$province."'");
            $query->execute();
            //获取省份id
            $pid = $query->fetchColumn();

            $stmt2 = $pdo->prepare("INSERT INTO city(`id`,`name`,`p_id`) VALUES(:id,:name,:pid)");
            $stmt2->bindParam(':name',$name);
            $stmt2->bindParam(':pid',$pid);
            $stmt2->bindParam(':id',$cid);
            if($stmt2->execute()):
                continue;
            else:
                echo '插入城市'.$name.'失败!';
                //如果插入失败执行回滚操作
                $pdo->rollBack();
                $pdo=null;
                return;
           endif;
        }
    }else{
        echo "插入省份".$province."失败!";
        //如果插入失败执行回滚操作
        $pdo->rollBack();
        $pdo=null;
        return;
    }

endforeach;
//如果所有数据插入成功执行提交操作
$pdo->commit();
$pdo = null;
?>

至此,执行上述代码,就可以将省市信息插入你的数据库了。