本帖最后由 free212 于 2011-11-16 16:34:53 编辑

解决方案 »

  1.   


    $reg_zone = '/[\x80-\xff]+省([\x80-\xff]+市)?/';
    foreach ($list as $val) $str .= $val; //把列表连成字符串
    $rz = array();
    while ($count = preg_match($reg_zone, $str, $match)) {
    array_push(array($match[0], $count));
    str_replace($match[0], '', $str);
    }var_dump($rz); //结果
      

  2.   

    我out了,数组连接字符串,用implode()函数,不要用foreach
      

  3.   

    你这不是从数据库取得的数据嘛 用SQL 不就可以了?COUNT GROUP BY
      

  4.   

    直接 select count(*),address from table group by address
      

  5.   

    文件    的话用sscanf
    数据库  的话看楼上
      

  6.   


    是这个意思,可是因为数据库里的地址格式是包括运营商的,而我只需要统计到市就行了,所以不能仅group,mysql不知能不能切分地址。
      

  7.   

    在手册中找到一个函数似乎可行 SELECT SUBSTRING_INDEX('江苏省 电信',' ',1) 
    select count(*) as aa,SUBSTRING_INDEX(address,' ',1) as bb from table group by bb;谢谢各位高见
      

  8.   

    上面有错,count方法不对,写了个效率更高的:function GuestCount($list) {
    $reg_zone = '/[\x80-\xff]+省([\x80-\xff]+市)?/';
    $str = implode($list);
    $rz = array();
    while (preg_match($reg_zone, $str, $match)) {
    $str = str_replace($match[0], '', $str, $count);
    array_push($rz, array($match[0], $count));
    }
    return $rz;
    }//----------------- 测试 ----------------------+$list = array(
    '1 49.81.64.189 江苏省 电信',
    '2 116.24.72.197 广东省深圳市龙岗区 电信',
    '3 116.24.72.197 广东省深圳市龙岗区 电信',
    '4 123.150.183.102 贵州省贵阳市 联通',
    '5 180.186.75.3 北京市 时代互联',
    '6 123.232.213.180 山东省济南市 联通',
    '7 222.170.166.38 黑龙江省伊春市 电信ADSL',
    '8 49.81.64.189 江苏省 电信'
    );foreach (GuestCount($list) as $row) {
    echo "$row[0]($row[1])<br>";
    }/*
    江苏省(2)
    广东省深圳市(2)
    贵州省贵阳市(1)
    山东省济南市(1)
    黑龙江省伊春市(1)
    */
      

  9.   

    我觉得底端的服务尽量少点逻辑比较好,最好都是ask -> answer的形式,便于维护