首页 > 编程技术 > php

php数组的遍历函数与方法例子

发布时间:2016-11-25 15:40

php中数组遍历方法有很多种,如有:for,foreach,while(),list(),each()这些函数与方法都要我们在数组遍历中会用到的,下面给大家介绍一下。

1. 使用for语句循环遍历数组

a. 其它语言(只有这一种方式)
b. PHP中这种方式不是我们首选方式
c. 数组必须是索引数组,而且下标还必须是连续的 索引数组下标还可以不连序,数组还有关联数组)

 代码如下 复制代码

< ?php
/*
* 我们想要在遍历的过程中改变以下数组中某些元素的值
*/
$people = Array(
Array(’name’ => ‘Kalle’, ’salt’ => 856412),
Array(’name’ => ‘Pierre’, ’salt’ => 215863)
);
for($i = 0; $i < sizeof($people); ++$i)
{
$people[$i]['salt'] = rand(000000, 999999);
}
?>

以上代码的问题,在于for的第二个表达式会导致代码执行很慢--因为每次循环时都要 计算一遍数组的长度。由于数组的长度始终不变,我们可以用一个中间变量来存储数组长度, 然后用这个变量作为for循环的第二个表达式。这样在循环的时候就可以直接使用该变量的值, 不用每次重新计算。 如下:

 代码如下 复制代码

< ?php
$people = Array(
Array(’name’ => ‘Kalle’, ’salt’ => 856412),
Array(’name’ => ‘Pierre’, ’salt’ => 215863)
);
for($i = 0, $size = sizeof($people); $i < $size; ++$i)
{
$people[$i]['salt'] = rand(000000, 999999);
}
?>

2. 使用foreach语句循环遍历数组

foreach(数组变量 as 变量值){
 循环体
}

a. 循环次数由数组的元素个数决定
b. 每一次循环都会将数组中的元素分别赋值给后面变量

foreach(数组变量 as 下标变量=> 值变量){

}

例子

 代码如下 复制代码

foreach遍历3维数组
 //foreach循环一个3维数组
/*
$biaoge=array(
"市场部"=>array(
array(1,"gaomou1","jingli11",4000),
array(2,"gaomou2","jingli22",4000),
array(3,"gaomou3","jingli33",4000)
 ),
"客服部"=>array(
array(1,"gao1","li11",4000),
array(2,"gao2","li22",4000),
array(3,"gao3","li33",4000)
),
"业务部"=>array(
 array(1,"mou1","jing11",4000),
 array(2,"mou2","jing22",4000),
 array(3,"mou3","jing33",4000)
)
 );
foreach($biaoge as $key=>$value){
echo '<table align="center" width="600" border="1">';
echo '<caption>联系表</caption>';
echo '<tr bgcolor="#dddddd">';
echo '<th>标号</th><th>名字</th><th>职位</th><th>工资</th></tr>';
foreach($value as $row){
if($row%2==0){
$bg="#ffffff";
 }else{
 $bg="#dddddd";
 }
 echo '<tr bgcolor='.$bg.'>';
 foreach($row as $col){
 echo '<td>'.$col.'</td>';
 }
 echo '</tr>';
}
echo '</table>';
 }
echo "<pre>";
print_r($biaoge);
echo "</pre>";

3. while() list() each() 组合循环遍历数组

each()函数,
 
a. 需要一个数组作为参数
b. 返回来的也是一个数组
c. 返回来的数组是0, 1, key, value四个下标(固定的)

0和key下标是当前参数数组元素的?

1和value下标是当前对数数组元素的值

d. 默认认当前元素就是第一个元素
e. 每执行一次后就会将当前元素向后移动
f. 如果到最后的元素再执行这个函数,则返回false

使用each遍历数组的示例代码如下:

 代码如下 复制代码
<?php
//使用each函数遍历数组
$arrGoogle=array('google','Gmail','Chrome','Android');
//第一次使用each取得当前键值对,并且将指针移到下一个位置
$arrG=each($arrGoogle);
//打印结果,并且换行以清晰显示结果
print_r($arrG);
print '<br>';
$arrGmail=each($arrGoogle);
print_r($arrGmail);
print '<br>';
$arrChrome=each($arrGoogle);
print_r($arrChrome);
print '<br>';
$arrAndroid=each($arrGoogle);
print_r($arrAndroid);
print '<br>';
//当指针位于数组末尾再次执行函数each,如果是这样再次执行结果返回false
$empty=each($arrGoogle);
//如果指针无法继续后移返回false
if($empty==false){
print '指针以位于数组末尾,无法在向后移,故返回false';
}
?>

注意:该函数的参数和返回值(在执行该函数前指针不位于数组末尾时)都为数组,在执行函数前数组指针位于数组末尾时再次执行该函数返回值为false
       开始的位置是第一个元素,每(正常)执行一次该函数,指针向后移到下一个地址 
list()函数

a. list()=array(); 需要将一个数组赋值给这个函数
b. 数组中的元素个数,要和list()函数中的参数个数相同
c. 数组中的每个元素值会赋值list()函数中的每个参数,list()将每个参数转为变量
d. list()只能接收索引数组
e. 按索引的下标的顺序

这不是真正的函数,而是PHP的语言结构。list()用一步操作给一组变量进赋值,即把数组中的值赋给一些变量。list()仅能用于数字索引的数组并假定数字索引从0开始。语法格式如下所示:

list(mixed varname,mixed ...)=array_expression             //list()语句的语法格式
list()语句和其它函数在使用上有很大的区别,并不是直接接收一个数组作为参数。而是通过“=”去处符以赋值的方式,将数组中每个元素的值,对应的赋给list()函数中的每个参数。list()函数又将它中的每个参数转换为直接可以在脚本中使用的变量。使用方法如下 :

 代码如下 复制代码
<?php
$info=array('coffee','brown','caffeine');              //声明一个索引数组$info
 
list($drink,$color,$power)=$info;                      //将数组中的所有元素转为变量
echo "$drink is $color and $power makes it special.n";//输出的三个变量值是数组中三个元素的值
 
list($drink, ,$power)=$info;                           //将数组中的部分元素变为变量
echo "$drink has $power.n";                           //输出的两个变更值是数组中的前两个元素的值
 
list(,,$power)=$info;                                  //跳过前两个变量只将数组中第三个元素的值转为变量
echo "I need $power!n";                               //输出的一个变量值是数组中桃花汛三个元素的值勤
?>

通过上例了解list()函数的用法之后,将each()函数和list()函数结合起来使用。代码如下:

 代码如下 复制代码

<?php
$contact=array("ID"=>1,"姓名"=>"高某","公司"=>"A公司","地址"=>"北京市");
list($key,$value)=each($contact);           //将each()函数和list()函数联合使用
echo "$key=>$value";                        //输出变量$key和$value,中间使用"=>"分隔
?>

while() 函数

while()循环的语法格式如下:

 代码如下 复制代码
while( list($key,$value) = each(array_expressin) ){
       循环体;
}

使用这种组合改写前面使用foreach遍历过的一维数组。代码如下所示:

 代码如下 复制代码

<?php
 //声明一个一维的关联数组$contact
 $contact=array("ID"=>1,
  "姓名"=>"高某",
  "公司"=>"A公司",
  "地址"=>"北京市",
  "电话"=>"(010)987665432",
  "EMAIL"=>"gao@php.com"
 );
 //以HTML列表的方式输出数组中每个元素的信息
 echo '<dl>一个联系人信息:';
 while(list($key,$value) = each($contact) ){      //将foreach语句改写成while,list()和each()的组合
  echo "<dd>$key:$value</dd>";                 //输出每个元素的键/值勤
  }
 echo '</dl>';
?>

while() 遍历数据是需要结合list或each函数配置才可以遍历哦,否则 它单独是无法完成数组遍历的哦。

我们用到最多的日志肯定是数字型的日期了,但有时工作需要要把日期转换成中文要怎么处理?下面一起来看一个php日期转中文程序代码吧。

如果我们直接使用date函数获取日期显示的是数字的,如下

 代码如下 复制代码

<?php  
   echo   date("Y-m-d");  
?>

输出的

2014-10-11

那么我们如果想得到

二零一四年十月十一日

怎么处理呢,后来看到一个朋友写了一句话函数

 代码如下 复制代码

<?php
#php日期转中文
$str = '2014-10-11';
echo str_replace(str_split('0123456789'), str_split('零一二三四五六七八九',3), date('Y',strtotime($str)).'年'.trim(str_replace('1十','十',implode('十', str_split(date('n',strtotime($str))))),'0').'月'.trim(str_replace('1十','十',implode('十', str_split(date('d',strtotime($str))))),'0')).'日';
?>

输出结果:

二零一四年十月十一日

文章给大家介绍一个PHP自动批量生成会员卡号程序的例子,其实原理非常的简单我们将0-Z(0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ)分别代表数值0-35,如字母Z代表35。这样的话我要得到一个5位的编号,最大信息量就是36的5次方了,36^5 = 60466176,即最大的5位编号相当于10进制的数字:60466176

当我们要将一个庞大的数据进行编号时,而编号有位数限制,比如5位的车牌号、10位的某证件号码、订单流水号、短网址等等,我们可以使用36进制计算出符合位数的不重复的编号。
查看演示DEMO
我们将0-Z(0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ)分别代表数值0-35,如字母Z代表35。这样的话我要得到一个5位的编号,最大信息量就是36的5次方了,36^5 = 60466176,即最大的5位编号相当于10进制的数字:60466176。
本文中为了做演示,我们假定某俱乐部发放一批10位的会员卡号,会员卡号由3位城市编号+5位卡号编码+2位校验码组成。城市编号用区号表示,如755代表深圳,5位卡编号则由36进制的卡编号组成,后面两位校验码则是通过一定的算法生成的,校验码的用处是可以验证卡号的合法性。这样的话,我们生成的10位卡号相当于最大能满足6000多万会员卡号,并且是不重复唯一的卡号。
PHP
我们使用PHP进行进制转换,10进制转36进制。
 

 代码如下 复制代码
class Code {
    //密码字典
    private $dic = array(
        0=>'0',    1=>'1', 2=>'2', 3=>'3', 4=>'4', 5=>'5', 6=>'6', 7=>'7', 8=>'8',    
        9=>'9', 10=>'A',  11=>'B', 12=>'C', 13=>'D', 14=>'E', 15=>'F',  16=>'G',  17=>'H',    
        18=>'I',19=>'J',  20=>'K', 21=>'L',  22=>'M',  23=>'N', 24=>'O', 25=>'P', 26=>'Q',    
    27=>'R',28=>'S',  29=>'T',  30=>'U', 31=>'V',  32=>'W',  33=>'X', 34=>'Y', 35=>'Z'
    );
 
 
    public function encodeID($int, $format=8) {
        $dics = $this->dic;
        $dnum = 36; //进制数
        $arr = array ();
        $loop = true;
        while ($loop) {
            $arr[] = $dics[bcmod($int, $dnum)];
            $int = bcdiv($int, $dnum, 0);
            if ($int == '0') {
                $loop = false;
            }
        }
        if (count($arr) < $format)
            $arr = array_pad($arr, $format, $dics[0]);
 
        return implode('', array_reverse($arr));
    }
 
    public function decodeID($ids) {
        $dics = $this->dic;
        $dnum = 36; //进制数
        //键值交换
        $dedic = array_flip($dics);
        //去零
        $id = ltrim($ids, $dics[0]);
        //反转
        $id = strrev($id);
        $v = 0;
        for ($i = 0, $j = strlen($id); $i < $j; $i++) {
            $v = bcadd(bcmul($dedic[$id {
                $i }
            ], bcpow($dnum, $i, 0), 0), $v, 0);
        }
        return $v;
    }
 
}
 


我们定义Code类,先定义密码字典,即0-Z分别对应的数值,方法encodeID($int, $format)中参数$int表示数字,$format表示位数长度,比方encodeID(123456789,5)表示将数字123456789转换成5位的36进制编号,而方法decodeID($ids)用于将36进制的编号转换成10进制的编号。
我们可以这样来生成卡号:

 代码如下 复制代码
 
$code = new Code();
$card_no = $code->encodeID(888888,5);

如上,我们就可以得到一个5位的卡编号,它实际代表着卡号是888888(6个8)的会员编号,而实际进行转换后是5位编号:0J1VC。
接着,我们将城市编号和校验码加上,城市编号是已经定义好的,校验码则通过一定的算法取得,本例中,我们使用简单的算法:将前三位城市编号和五位卡编号进行md5加密,然后取md5值的前2位作为校验码,这样就得到了编号后面的两位校验码。
 

 代码如下 复制代码
$card_pre = '755';
$card_vc = substr(md5($card_pre.$card_no),0,2);
$card_vc = strtoupper($card_vc);
echo $card_pre.$card_no.$card_vc;

实际应用中,可以通过数据库得到10进制的编号,保证编号唯一,再将上述代码组合,最终生成一个10位的不重复的会员卡号。

在使用php socket时我们需要先开启socket扩展了,我们可以使用phpinfo();查看是否开启了socket扩展,否则在php.ini中开启了,如果没有开启我们可以参考下面方法来设置

windows 系统中socket扩展

windows 下可以直接修改php.ini 文件 去掉extension=php_sockets.dll 前面的分号重启就OK了


在linux下给PHP安装socket扩展

 代码如下 复制代码

#cd /home/php5.2.1/ext/sockets
#/server/php/bin/phpize
#./configure --prefix=/usr/local/php/lib --with-php-config=/server/php/bin/php-config --enable-sockets
#make
#make install

再修改/usr/local/php/etc/php.ini文件
#extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/" (php5.4版本以上不用加扩展路径)
extension=sockets.so

重启apache

好了都好了下面就开始吧

 代码如下 复制代码

//POST提交
function socketPost($url,$data){
$postStr = '';
$postLen = '';
$out = '';
//解析域
$urlInfo = parse_url($url);
$host = $urlInfo['host'];
if(!isset($urlInfo['query'])) $urlInfo['query'] ='';
$path = $urlInfo['path'].'?'.$urlInfo['query'];
//组织数据
foreach($data as $key=>$value){
$postStr .=$key.'='.rawurlencode($value).'&';#这里需要对post的值进行编码,否则会出现中断
}
$postStr = trim($postStr,"&");
 
$postLen = strlen($postStr);
$fp = fsockopen($host, 80, $errno, $errstr, 3);
if ($fp) {
  
$out .="POST ".$path." HTTP/1.0\r\n";
$out .="Host: ".$host."\r\n";
$out .= "Content-type: application/x-www-form-urlencoded\r\n";
$out .= "Content-Length: ".$postLen."\r\n";   #这里最好加上Connection: close
$out .= "\r\n";
$out .= $postStr;
fwrite($fp, $out);
fclose($fp);

}

}

使用方法

 代码如下 复制代码

socketPost("提交的地址",array("username"=>"这里是post的username","password"=>321312312));

function socketGet($url){
$urlInfo = parse_url($url);
$host = $urlInfo['host'];
if(!isset($urlInfo['query'])) $urlInfo['query'] ='';
$path = $urlInfo['path'].'?'.$urlInfo['query'];
$fp = fsockopen($host, 80, $errno, $errstr, 3);
if ($fp) {
//调用模块进行抓取信息
$out = "GET {$path} / HTTP/1.1\r\n";
$out .= "Host: {$host}\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
fclose($fp);

}
}

使用方法:socketGet("url");

工作需要封装好方法方便同事调用。

URL重定向我们会使用到header函数来操作,最简单的就是直接使用header(‘Location: ‘ . $url);就可以了,如果要做像301定向我们还需要发送状态代码,下面整理了一些例子一起来看看吧。
 代码如下 复制代码


// URL重定向
function redirect($url, $time=0, $msg=”) {
//多行URL地址支持
$url = str_replace(array(“\n”, “\r”), ”, $url);
if ( empty($msg) )
$msg = “系统将在{$time}秒之后自动跳转到{$url}!”;
if (!headers_sent()) {
// redirect
if (0 === $time) {
header(‘Location: ‘ . $url);
} else {
header(“refresh:{$time};url={$url}”);
echo($msg);
}
exit();
} else {
$str = “<meta http-equiv=’Refresh’ content=’{$time};URL={$url}’>”;
if ($time != 0)
$str .= $msg;
exit($str);
}
}
 
//url重定向2

function redirect($url) {
echo “<script>”.
“function redirect() {window.location.replace(‘$url’);}\n”.
“setTimeout(‘redirect();’, 1000);\n”.
“</script>”;
exit();
}

用HTTP头信息

也就是用PHP的HEADER函数。PHP里的HEADER函数的作用就是向浏览器发出由HTTP协议规定的本来应该通过WEB服务器的控制指令,例如声明返回信息的类型("Context-type: xxx/xxx"),页面的属性("No cache", "Expire")等等。
用HTTP头信息进行PHP重定向到另外一个页面的方法如下:

 代码如下 复制代码
<?php
$url = "www.111cn.net"; 
if (!empty($url))   
{   
    Header("HTTP/1.1 303 See Other"); //这条语句可以不写 
    Header("Location: $url"); 
}   
?>   

注意一下,"Localtion:"后面有一个空格,下面整理了一个全面的函数

 代码如下 复制代码

/**
 * get_redirect_url()
 * Gets the address that the provided URL redirects to,
 * or FALSE if there's no redirect.
 *
 * @param string $url
 * @return string
 */
function get_redirect_url($url){
 $redirect_url = null;
 
 $url_parts = @parse_url($url);
 if (!$url_parts) return false;
 if (!isset($url_parts['host'])) return false; //can't process relative URLs
 if (!isset($url_parts['path'])) $url_parts['path'] = '/';
 
 $sock = fsockopen($url_parts['host'], (isset($url_parts['port']) ? (int)$url_parts['port'] : 80), $errno, $errstr, 30);
 if (!$sock) return false;
 
 $request = "HEAD " . $url_parts['path'] . (isset($url_parts['query']) ? '?'.$url_parts['query'] : '') . " HTTP/1.1rn";
 $request .= 'Host: ' . $url_parts['host'] . "rn";
 $request .= "Connection: Closernrn";
 fwrite($sock, $request);
 $response = '';
 while(!feof($sock)) $response .= fread($sock, 8192);
 fclose($sock);
 
 if (preg_match('/^Location: (.+?)$/m', $response, $matches)){
  return trim($matches[1]);
 } else {
  return false;
 }
 
}
 
/**
 * get_all_redirects()
 * Follows and collects all redirects, in order, for the given URL.
 *
 * @param string $url
 * @return array
 */
function get_all_redirects($url){
 $redirects = array();
 while ($newurl = get_redirect_url($url)){
  if (in_array($newurl, $redirects)){
   break;
  }
  $redirects[] = $newurl;
  $url = $newurl;
 }
 return $redirects;
}
 
/**
 * get_final_url()
 * Gets the address that the URL ultimately leads to.
 * Returns $url itself if it isn't a redirect.
 *
 * @param string $url
 * @return string
 */
function get_final_url($url){
 $redirects = get_all_redirects($url);
 if (count($redirects)>0){
  return array_pop($redirects);
 } else {
  return $url;
 }
}

标签:[!--infotagslink--]

您可能感兴趣的文章: