PHP遍历数组

foreach

PHP代码:



  1. <?php

  2.  

  3. $url
    = array
    (
    '新浪'
    =>'www.sina.com'
    ,

  4.                    '雅虎'
    =>'www.yahoo.com'
    ,

  5.                    '网易'
    =>'www.163.com'
    ,

  6.                    '腾讯'
    =>'www.qq.com'
    ,

  7.                    '百度'
    =>'www.baidu.com'

  8.                )
    ;

  9.  

  10. foreach
    (
      $url
    as
    $link
    )
    {

  11.  

  12.   echo
    $link
    .'<br><br>'
    ;

  13.  

  14. }

  15.  

  16. ?>



  上面的代码中我们用到了 foreach 语句,这是一个用来遍历数组中数据的最简单有效的方法。

foreach 仅能用于数组,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误。有两种语法,第二种比较次要但却是第一种的有用的扩展。



第一种语法:

foreach (array_expression as $value) statement

这种格式遍历给定的 array_expression 数组,as 是关键词。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。statement是后续操作,如果有多个语句,你可以象上例那样采用大括号包含。

上例中,我们循环读取数组$url中的每个单元,并且每次都把该单元的值赋值给变量$link,再echo打印输出这个$link的值,然后再进行下一次循环直到数组中不再有数据。

你动手试了吗?如果你试了,看到输出结果是不是觉得很有趣呢?我知道一会儿你就又有疑问了:为什么没有“新浪”“网易”这样的站名呢?要怎样做才能得到呢?

$url数组定义中,“新浪”“网易”等都是作的键名而不是数组的值,我们的第一种语法只是循环取得数组中每个值。如果要得到数组的键名,可以采用第二种语法:

第二种语法:

foreach (array_expression as $key => $value) statement

第二种格式做同样的事,只除了当前单元的键值也会在每次循环中被赋给变量 $key

例如10-2:


 

PHP代码:



  1. <?php

  2.  

  3. $url
    = array
    (
    '新浪'
    =>'www.sina.com'
    ,

  4.                    '雅虎'
    =>'www.yahoo.com'
    ,

  5.                    '网易'
    =>'www.163.com'
    ,

  6.                    '腾讯'
    =>'www.qq.com'
    ,

  7.                    '百度'
    =>'www.baidu.com'

  8.                )
    ;

  9.  

  10. foreach
    (
      $url
    as
    $site
    => $link
    )
    {

  11.  

  12.   echo
    "<a href=http://$link>$site</a><br><br>"
    ;

  13.  

  14. }

  15.  

  16. ?>



  $site得到键值(如“新浪”),$link得到该单元的值(如“www.sina.com”),我在中间夹了一些HTML代码,相信你会看懂的。下面我再加点东西你能看懂吗?例10-3:

 

PHP代码:



  1. <?php

  2.  

  3. $url
    = array
    (
    '新浪'
    =>'www.sina.com'
    ,

  4.                    '雅虎'
    =>'www.yahoo.com'
    ,

  5.                    '网易'
    =>'www.163.com'
    ,

  6.                    '腾讯'
    =>'www.qq.com'
    ,

  7.                    '百度'
    =>'www.baidu.com'

  8.                )
    ;

  9.  

  10. $n
    = 0
    ;

  11.  

  12. foreach
    (
      $url
    as
    $site
    => $link
    )
    {

  13.  

  14.   ++$n
    ;

  15.  

  16.   echo
    "第 $n  名:<a href=http://$link>$site</a><br><br>"
    ;

  17.  

  18. }

  19.  

  20. ?>



注:foreach 开始执行时,数组内部的指针会自动指向第一个单元。这意味着不需要在 foreach 循环之前调用 reset()

注: 此外注意 foreach 所操作的是指定数组的一个拷贝,而不是该数组本身。因此即使有 each() 的构造,原数组指针也没有变,数组单元的值也不受影响。

注:foreach 不支持用“@”来禁止错误信息的能力。

 

中文分词

中文分词对于大型网站的搜索及SEO优化都是一个难点,同时也是一个重点。很多人会使用Lucene中文分词,但是想维护如此大的一个词库不是一件容易的事情,可行性值得考证。

在这种情况下为什么不使用他人提供的服务呢?

优点:
1、稳定、速度快、分词准确
2、不用维护
缺点:
1、他人的免费服务始终不放心,万一停了怎么办?

以下是百度热门相关关键字和discuz标签功能提供的免费ROA服务(php版函数)

//根据标题获得百度热门相关关键字,返回字符串
function baiduKeyword($title,$num=5,$charset="UTF-8"){

$title=iconv($charset, "GB2312", $title);
$w=file_get_contents('http://d.baidu.com/rs.php?q='.urlencode($title).'&tn=baidu');
//die($w);
//获得列表部分
preg_match_all("|<div id=con>(.*)</div>|isU",$w,$con);
$list=$con[1][0];
//获得具体内容
preg_match_all("|<ul><li class=ls>(.*)</li><li class=kwc><a target=_blank href=(.*)>(.*)</a></li><li class=bar><img src=http://img.baidu.com/img/bar_1.gif height=6 width=(\d*) align=absmiddle vspace=5></li></ul>|isU",$list,$content);
//合并成数组,被搜索次数做为键值
$c=array_combine($content[4],$content[3]);
//排序
krsort($c);
//取前N条
$r=array_slice($c, 0, $num); 
//转换成字符串
$result=implode(",", $r);
$result=iconv("GB2312", $charset,$result);
return $result;
}

[break]
//通过discuz获取文章关键字(标签),输入标题和内容 即可返回5个关键字数组
function getTags($title,$content){

$subjectenc = rawurlencode(strip_tags($title));
$messageenc = rawurlencode(strip_tags(preg_replace("/\[.+?\]/U", '',$content)));
$subjectenc =substr($subjectenc,0,60);
$messageenc=substr($messageenc,0,1200);
$data = @implode('', file("http://keyword.discuz.com/related_kw.html?title=$subjectenc&content=$messageenc&ics=utf-8&ocs=utf-8"));

$kws = array();
if($data) {
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($parser, $data, $values, $index);
xml_parser_free($parser);
foreach($values as $valuearray) {
if($valuearray['tag'] == 'kw' || $valuearray['tag'] == 'ekw') {
$kw =trim($valuearray['value']);    
$kws[] =$kw ;

}
}
}
return $kws;
}

自动获取标签的方法

网上资料:这是Discuz!的方法

首先看代码以gbk为例
[php]
<?php
//强制使用字符集
@header('Content-Type: text/html; charset=gbk');
$subjectenc = $_GET['subjectenc'];
$messageenc = preg_replace("/\[.+?\]/U", '', $_GET['messageenc']);
//关键部分,这里是将你网站的文章标题和内容发送到dz的标签库中去匹配,返回的是一个xml文档
$data = @implode('', file("http://keyword.discuz.com/related_kw.html?title=$subjectenc&content=$messageenc&ics=gbk&ocs=gbk"));//把标题和内容发送到dz官方去找
if($data) {//有数据返回
$parser = xml_parser_create();//建立一个 XML 解析器
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($parser, $data, $values, $index);//将 XML 数据解析到数组中
xml_parser_free($parser);
$kws = array();
foreach($values as $valuearray) {//循环单曲xml中的数据到数组$kws
   if($valuearray['tag'] == 'kw' || $valuearray['tag'] == 'ekw') {
$kws[] = siconv(trim($valuearray['value']), ‘gbk’, 'utf-8');//编码转换
}
}
$return = '';
if($kws) {
   foreach($kws as $kw) {
$return .= $kw.' ';//把获取到的标签用空格链接
   }
   $return = trim($return);
}
echo   $return;//返回匹配到的标签
} else {
echo ' ';//没有匹配的标签
}
?>
[/php]

[break]

在网上还有一种类似的函数,使用方法:
<?php   
//强制使用字符集
@header('Content-Type: text/html; charset=gbk');   
$subjectenc ='用“超级站长”安装Discuz!和UCHome,超级简单!'; //这是标题   
$messageenc = preg_replace("/\[.+?\]/U", '', '用“超级站长”安装Discuz!和UCHome,超级简单!'); //这是内容  
//从内容中找标题中有TAG;  
$data = @implode('', file("http://keyword.discuz.com/related_kw.html?title=$subjectenc&content=$messageenc&ics=gbk&ocs=gbk"));//
把标题和内容发送到dz官方去找   
if($data) {
$parser = xml_parser_create();//建立一个 XML 解析器
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($parser, $data, $values, $index);//将 XML 数据解析到数组中
xml_parser_free($parser);   
$kws = array();
foreach($values as $valuearray) {
if(in_array($valuearray['tag'],array('kw','ekw'))) {   //kw和ekw是 DZ返回回来的XML中的一个元素名  
    $kws[] = iconv('utf-8','gbk',$valuearray['value']);//编码转换   
   }   
}
}
//最后出来的是数组.
print_r($kws);
?>  

标签: php, gbk, 数组

博客启航

    在今年9月27号,就买了空间和注册了个域名,到11月份下旬,一直犹豫玩什么网站。

    期间,渐渐断断搞了几种,从起先BZCMS的个人主页到easytalk的迷你微博再到用loveWall模板改编的记忆墙,期间可以说真的是纠结的,一方面想在这个网路中拥有一个与众不同的站点,一方面又想实实在在记录自己的生活,很矛盾的说。其实在早几年在其他门户网站上便注册有博客,但可能对于不属于自己的比较惰性,因此三分钟热度后也就不了了之了。

    这个月开始实训java ee项目,比较没时间专注于建设网站,也不想把它荒废着,因此,也就用emlog做了现在这个个人博客。博客名本为qq网名小屋
,又觉得太耸,便改为 浮世相忘 - 小屋
ms更耸..

    看着空荡荡的博,对比一些网路大神的主页,羡慕的他们的实力佩服他们的境界,奋斗!