文件内容排序(十万火急)

ghostwuboy 2009-10-19 06:06:29
文件内容如下:
"蜀ICP备07004826号","Volvo Club 沃尔沃车友会","volvoclub.cn","202.104.186.6",
"晋B2-20040001","中国煤炭资源网","shanxicoal.com.cn","202.104.186.5",
"京ICP备06022664号","博富塔","bofut.biz","202.104.186.4",
"闽ICP备05000184号","瓷都热线","dehuabaici.com","202.104.186.4",
"鲁ICP备06037787号","恒华化工厂","henghua.cn","202.104.186.5",
"粤ICP备05023483号","荔兴化工有限公司","gzlixing.com","202.104.186.4",
"粤ICP备06049847号","汕头市易兴商务有限公司","czyihua.cn","202.104.186.5",
"苏ICP备07023508号","中华脑萎缩网","zhnws.com","119.146.223.172",
"鄂ICP备07009261号","湖北省南方汽车职业学校网站","nanfangqc.com","58.252.3.146",
"鲁ICP备07001351号","青春特区","esunboy.cn","202.104.186.6",
"京ICP备06008853号","北京博安天慧科技有限公司","tketang.net","202.104.186.5",
"京ICP备06008853号","北京博安天慧科技有限公司","tketang.com","203.169.164.18",
"京ICP备06008853号","北京博安天慧科技有限公司","tketang.com.cn","202.104.186.5",
"晋ICP备06006096号","天南地北晋城人","jcren.com.cn","58.252.3.146",
"苏ICP备07023848号","江苏溧阳恒昌贸易有限公司","lyhcmy.com","202.104.186.4",
"闽ICP备05005551号","顶尖电子","teckor.com","202.104.186.5",
"晋ICP备07003402号","中国说法网","shuofa30.com","202.104.186.4",
"沪ICP备07020340号","上海莱茵小镇","ppstar.cn","119.146.223.176",
"琼ICP备07001874号","海南百健生物开发有限公司","chinajk.cc","119.146.223.133",
......后面还有好多相同的内容

用php实现让相同的省份简写放在一起:如第五行应该和第十行在一起
我的思路是读取每一行的内容把省份部分提取出来转换成拼音再比较,然后按照拼音的升序排列(文件中如何排序?),
我想请教下高手如何读取每一行的省份部分并把它们转换成拼音来比较最终实现结果,不知道我的思路对不对
请教下高手其它思路,谢谢,不胜感激
...全文
170 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ghostwuboy 2009-10-20
  • 打赏
  • 举报
回复
<?php
$blocks = file("../test_file/test.txt");
$nums = count($blocks);
$province = array(
京,
津,
沪,
渝,
冀,
豫,
云,
辽,
黑,
湘,
皖,
鲁,
新,
苏,
浙,
赣,
鄂,
桂,
甘,
晋,
蒙,
陕,
吉,
闽,
贵,
粤,
青,
藏,
川,
宁,

);
$temp_array = array();
//foreach($blocks as $key => $value) {
// echo $key."-".$value."<br/>";
//}
for($i=0;$i<$nums;$i++){
for($j=0;$j<sizeof($province);$j++) {
$str = substr($blocks[$i],1,strpos($blocks[$i], 'ICP')-1);//取出第一个字
if($province[$j]==$str) {
for($k=0;$k<$nums;$k++) {
$temp_array[$k] = array($j=>$blocks[$i]);
//echo $j."-".$blocks[$i]."<br/>";
}
}
}
}
?>
取出第一字已经实现了,我现在的问题是如何根据这个取出的字来让他们相同的放在一起,
我觉得肯定要用到关联数组,五楼的朋友请问下如何把取出来的第一个字的那列作为键建立一个数组?谢谢
yunfeifan 2009-10-20
  • 打赏
  • 举报
回复
取出第一个字就好了,
或者如果记录不是太多的话可以把第一个列作为键建立一个数组,然后保持索引关系的按键排序。
kyzy_yy_pm 2009-10-20
  • 打赏
  • 举报
回复
中文转换成拼音,自己写代码实现就行了,字符太多,发不过来
ghostwuboy 2009-10-20
  • 打赏
  • 举报
回复
第二行是这样的:晋B2-20040001 这种方法过滤好像不行哦?
还有就是中文如何转换成拼音?
ghostwuboy 2009-10-20
  • 打赏
  • 举报
回复
谢谢各位的帮助,我已经解决了,想了很久觉得我的思路很烦,而且不效率,下午到问主管,得到主管的指点,呵呵,主管厉害啊,几行代码就搞定啊。
源码如下:
方法一:

<?php
$blocks = file("../test_file/test.txt");
$temp_array = array();
foreach($blocks as $key =>$value){
if(strpos($blocks[$key],'ICP')){
//取出每行的省份简称
$str = substr($blocks[$key],1,strpos($blocks[$key], 'ICP')-1);
}else {
$str = substr($blocks[$key],1,strpos($blocks[$key], 'B2')-1);
}
//为每个键取不同的键名
$temp_array[$str+$key] = $value;
unset($blocks[$key]);
}
array_multisort($temp_array,SORT_ASC,SORT_STRING);
foreach($temp_array as $key =>$value){
echo $key."-".$value."<br>";
}
$filename = "../test_file/test1.txt";
$file = fopen($filename, "w");
foreach($temp_array as $key =>$value){
$len=fwrite($file,$value);
}
fclose($file);
?>




方法二:

<?php
$blocks = file("../test_file/test.txt");
$temp_array = array();
foreach($blocks as $key =>$value){
if(strpos($blocks[$key],'ICP')){
//取出每行的省份简称
$str = substr($blocks[$key],1,strpos($blocks[$key], 'ICP')-1);
}else {
$str = substr($blocks[$key],1,strpos($blocks[$key], 'B2')-1);
}
//把值当键,键当值
$temp_array[$value] = $str;
unset($blocks[$key]);
}
ksort($temp_array);
foreach($temp_array as $key =>$value){
echo $value."-".$key."<br>";
}
$filename = "../test_file/test2.txt";
$file = fopen($filename, "w");
foreach($temp_array as $key =>$value){
$len=fwrite($file,$key);
}
fclose($file);
?>


东西做得少,函数不熟啊
ghostwuboy 2009-10-20
  • 打赏
  • 举报
回复
不是不给分啊,刚注册的号没有分啊
codeyell-com 2009-10-20
  • 打赏
  • 举报
回复
十万火急都不给点儿分
楼主真抠
ghostwuboy 2009-10-20
  • 打赏
  • 举报
回复
我刚才试了一下array_mutisort,这个确实能排序多维数组,但是我的两个数组没有合并,没有建立关联啊
我的源码:
<?php
$blocks = file("../test_file/test.txt");
$nums = count($blocks);
$province = array(
京,
津,
沪,
渝,
冀,
豫,
云,
辽,
黑,
湘,
皖,
鲁,
新,
苏,
浙,
赣,
鄂,
桂,
陇,
晋,
蒙,
陕,
吉,
闽,
贵,
粤,
青,
藏,
川,
宁,
琼,
蜀,

);
$temp_array = array();
for($i=0;$i<$nums;$i++){
//取出每行的第一个字即省份的简写
$str = substr($blocks[$i],1,strpos($blocks[$i], 'ICP')-1);
for($j=0;$j<sizeof($province);$j++) {
if($province[$j]==$str) {
$count++;
$temp_array[$i] = $j;
}
}
}
?>
$temp_array[$i]是我提出的每行的省份简称在$province这个数组出现的位置组成的一个数组,我的目的就是希望把这个数组和$blocks数组合并成一个新的数组,然后又这个$temp_array[]数组作为键,$blocks作为值,我只要对键进行排序就可以使相同的省份的记录在一起了
ghostwuboy 2009-10-20
  • 打赏
  • 举报
回复
是的,我现在的二个数组元素就是一样的,我试试你给我提供的这两个函数吧。。。呵呵 ,非常感谢
程序猿之殇 2009-10-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 iseagold 的回复:]
呵呵,谢谢楼上的朋友,转成拼音那部分暂时不做,就是不按照字母排序先,现在先让他们相同的在一起就可以,我想请问下:有没有一个函数可以合并两个数组,让其中一个数组作为另一个数组的键,利用array_combine的话会消除掉相同的键,所以无法完成我要的目的,有没有哪位朋友知道啊?呵呵谢谢了

[/Quote]
array_mutisort对某个属性直接进行排序,结果肯定就是相同的数据在一起了.你可以尝试一下.
如果两个数组元素个数相同,可以利用array_map来实现.
自定义一个函数,将一个数组的值当做另一个数组的索引.
详细参看手册.
ghostwuboy 2009-10-20
  • 打赏
  • 举报
回复
呵呵,谢谢楼上的朋友,转成拼音那部分暂时不做,就是不按照字母排序先,现在先让他们相同的在一起就可以,我想请问下:有没有一个函数可以合并两个数组,让其中一个数组作为另一个数组的键,利用array_combine的话会消除掉相同的键,所以无法完成我要的目的,有没有哪位朋友知道啊?呵呵谢谢了
程序猿之殇 2009-10-20
  • 打赏
  • 举报
回复
转成拼音,也可以.
不过给你个建议,可能会更好些.

将以上的信息保存成二维数组,可以将每个属性当成一维,为了排序也可以新增一个属性,作为排序.
然后按照 array_mutisort进行排序,这个函数的好处就是可以对多维进行排序.

http://blog.sevenight.com/index.php?m=blog&a=show&id=104
kxgsy163 2009-10-19
  • 打赏
  • 举报
回复
$key = md5(substr($str, strpos(ltrim($str, '"'), 'ICP'));
$a[$key][] = $str;


思路:取出ICP字符前的字符(引号去掉)MD5做键值。赋值新数组
w198909253132 2009-10-19
  • 打赏
  • 举报
回复
只想到一个笨办法,给每行字符串加个标识,比如循环给每行排序,1xxxx 2xxxx 这样 然后取到数字后第一个子(也就是省份),放到数组里(这里要带上标识,而且数字要放在省份后面,总之就是字符串操作),然后排序数组元素,这时就会按照拼音排好,最后把排好的数组元素循环排序,用到文件读写
比如返回元素 苏 23 就是说苏在原文件排23 现在应该去23条找苏,然后放到苏元素下标+1的位置

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧