php数组指针用法详解

 更新时间:2016年11月25日 15:51  点击:1553

先给出一条结论,然后我们在用代码来证明这个结论吧。$arrtmp=$arr;在这个赋值表达式中我把$arr叫做赋值数组,把$arrtmp叫做被赋值数组。数 组在赋值时,如果赋值数组的数组指针已经指向了数组末尾,则赋值之后赋值数组的数组指针会被重置,指向数组第一个元素;如果在赋值时,赋值数组的数组指针 没有指向数组末尾,而是指向了任何一个有效的数组元素,那么在赋值之后赋值数组的数组指针是不会被重置的,而是保留其原来指向的元素。在赋值之后,被赋值 数组不仅有了赋值数组的值,而且赋值数组的数组指针指向了那个元素,被赋值的数组也会指向自己中值相同的那个元素。
demo1:

<?php教程
$arr = array('var1'=>1,'var2'=>2,'var3'=>3,'var4'=>4,'var5'=>5);
while( list($key,$value) = each($arr) )
{
    if($value == 4) break;
}
var_dump(current($arr));

$arr1 = $arr;

var_dump(current($arr));
var_dump(current($arr1));
?>


demo1 的执行结果是:int(5) int(5) int(5) 。从这个结果可以看出,赋值前后$arr的数组指针位置没有发生任何变化,$arr1不仅值跟$arr相同,而且数组指针所指向的元素值也是相同的。现在 用上述结论来解释这个结果,在while循环中,有一个if判断语句,目的是不让$arr的数组指针指向数组末尾,而是保留在一个有效的位置。 在$value=4时会跳出循环,而each这个函数会将数组指针向前移动一位,这就导致了$arr的数组指针指向了第5个元素,所以在赋值之 前,current($arr)的结果是5,赋值之后,由于在赋值之前$arr的当前指针并没有指向末尾,因此在赋值之后不会将$arr的数组指针进行重 置,而是保留了其原有的位置,因此在赋值之后使用current($arr)的结果仍然是5。赋值时$arr1不仅获得了$arr的值,而且数组指针指向 的元素和$arr的相同,二者都是5。
demo2:

<?php
$arr = array('var1'=>1,'var2'=>2,'var3'=>3,'var4'=>4,'var5'=>5);
while( list($key,$value) = each($arr) )
{
    //if($value == 4) break;
}
var_dump(current($arr));

$arr1 = $arr;

var_dump(current($arr));
var_dump(current($arr1));
?>


demo2中我们将 if($value == 4) break; 这一句注释掉了,目的很简单,就是通过each将$arr的数组指针位置指向数组末尾。
demo2 的执行结果:bool(false) int(1) bool(false) 。如果数组指针对应的元素为0,“”,或者不是一个有效的值时,current函数会返回false,$arr的值中没有为0或者“”的情况,因此可以断 定是因为数组指针指向了一个无效的元素而导致current返回了一个false。换句话说就是可以确定在while循环完成之后,$arr的数组指针已 经指向了数组的末尾。所以我们看到在赋值之前current($arr)的值是false,而赋值之后current($arr)的值变成了1,说明赋值 之后$arr的数组指针被重置了,指向了数组的第一个元素。current($arr1)的值为false,说明赋值之后$arr1让然保留了赋值之 前$arr的数组指针指向的元素。

不知道描述清楚没有,还是将工作中问题简化一下,用下面代码说明一下吧。

<?php
          $arr = array('var1'=>1,'var2'=>2,'var3'=>3,'var4'=>4,'var5'=>5);
          while( list($key,$value) = each($arr) )
          {
               $$key = $value;
         }
         //下面这一步操作很关键,问题就出在这里,遍历完之后,对数组添加一个值。
         $arr['var6'] = 6;
        
        func($arr);
       
       function func($arrtmp)
       {
              while(list($key,$value) = each($arrtmp) )
              {
                     $$key = $value;
              }
              var_dump($var1);
              var_dump($var2);
              var_dump($var3);
              var_dump($var4);
              var_dump($var5);
              var_dump($var6);
       }
?>


输出结果:NULL NULL NULL NULL NULL int(6).

 

zend studio 5.5中文乱码解决方法


购买zend产品的用户太少了还是我安装的问题,装好后桌面选项中竟然没有“简体中文”的语言选项了,到配置文件夹里看了一会,在系统盘中搜索XML文件desktop_options.xml(例如:C:Documents and SettingsAdministratorZDEconfig_5.5 目录下的 desktop_options.xml)

<customized_property ID="desktop.language">
  <locale language="en" country="" variant=""/>
</customized_property>
将en改为zh,重启zend后就可以了。(不过不能进首选项去设置,不然你又要重复一次上面的操作了。因为首选项里只有英文给你选)
中文乱码的解决方法
从系统盘下windows/fonts中把所有的字体复制到
zend studio 5.5 安装目录下的,如D:Program FilesZendZendStudio-5.5.0jrelibfonts
的目录下,重启ZEND就可以了!

 

Zend Studio 中文字体显示彻底解决 & JAVA 环境下的中文乱码解决
这种解决方法应该不仅仅用于解决Zend studio的问题,也能够解决几乎所有给予java的编辑器字体问题,具体原理我就不细说了,大家应该很容易明白。
具体步骤:

    1、 找到jre_path/lib/目录,注意zend studio的jre目录一般在”c:program fileszendzendstudio-5.X.0jrelib”,而系统的jre目录一般在”c:program filesjavajre1.Xlib”。
2、除fontconfig.properties.src文件保留外,删除所有以fontconfig.开头的文件
3、复制fontconfig.properties.src文件为fontconfig.properties
4、在文件的末尾添加上,下面四行

         dialoginput.plain.alphabetic=Consolas
       dialoginput.bold.alphabetic=Consolas Bold
       dialoginput.italic.alphabetic=Consolas Italic
       dialoginput.bolditalic.alphabetic=Consolas Bold Italic
    5、在编辑器(zend studio)中指定字体位”dialoginput”,重启编辑器
6、注意:第4步的中“Consolas、Consolas Bold..“部分即为你选择的字体名称。以后如果希望更改字体,就要在这里改,然后重启编辑器即可生效。


win7下zend studio5.5中文乱码解决方法
1、打开 C:Documents and SettingsAdministratorZDEconfig_5.5desktop_options.xml(这个地址要根据自己的电脑而定。)
2、查找 editing.encoding
3、修改里面为 <encoding name=”UTF-8″/>
4、保存,并将该文件属性设置为只读,否则zend每次启动都会将 desktop_options.xml 初始化
5、重启 zend
注意,你现在打开 zend 有可能以前打开的utf-8文件还是乱码,没事,你只需要关掉该文件再重新打开即可

<?php教程
/*  类的声明
 *    1.你要开发的是什么,确定写什么类
 *    2.类中的成员一定要属于这个类  
 *       [修饰类的关键字] class 类名{
 *         成员属性:
 *         成员方法:
 *        }
 *    3.在类中声明成员属性时,前面必须有修饰词,当不确定使用哪个词时,使用var或public
 *    一个文件只保存一个类,文件名中包含类名,文件:类名.class.php
 *      类名的写法:
 *       变量:aaaBbbCcc
 *       函数:aaaBbbCcc
 *       常量:AAABBBCCC
 *       类名:AaaBbbCcc
 *     4.类中的成员属性,如果创建多个对象时,每个对象有不同的属性值时,不要直接给初值,在创建好对象之后再给值
 * 
 * 
 *  通过类来实例化对象
 *   1.使用的是new新建一个对象,加上类名,就是创建哪个类的对象
 *     $对象引用=new 类名;
 *   2.只要有一个new 关键字就是创建一个对象,创建一个对象就是在内存中分配了一个空间
 *
 *   只有对象才在内存有存储空间
 *
 *  对象的作用
 *
 *  对象在内存中的分配
 *
 *  对象的使用
 *   对象中的成员必须通过对象的引用来访问
 *   对象->成员
 *
 *    对象->成员属性
 *    对象->成员方法
 *
 *
 *
 */

---------------------------------------------------<?php

class Something {
// 在OOP类中,通常第一个字符为大写
var $x;
function setX($v) {
// 方法开始为小写单词,然后使用大写字母来分隔单词,例如getValueOfArea()
$this->x=$v;
}
function getX() {
return $this->x;
}
}
?>---------------------------------------------------


  当然你可以按自已的喜好进行定义,但最好保持一种标准,这样会更有效。

  数据成员在类中使用"var"声明来定义,在给数据成员赋值之前,它们是没有类型的。一个数据成员可
以是一个整数,一个数组,一个相关数组(associative array)或者是一个对象。

  方法在类中被定义成函数形式,在方法中访问类成员变量时,你应该使用$this->name,否则对一个方
法来说,它只能是局部变量。

  使用new操作符来创建一个对象:

 

 $obj=new Something;

  然后你可以使用成员函数通过:

  $obj->setX(5);
  $see=$obj->getX();

  在这个例子中,setX成员函数将5赋值给对象的成员变量x(不是类的),然后getX返回它的值5。

  你可以象:$obj->x=6那样通过类引用方式来存取数据成员,这不是一个很好的OOP习惯。我强烈建议通
过方法来存取成员变量。如果你把成员变量看成是不可处理的,并且只通过对象句柄来使用方法,你将是一
个好的OOP程序员。不幸的是,PHP不支持声明私有成员变量,所以不良代码在PHP中也是允许的。

  继承在PHP中很容易实现,只要使用extend关键字。

 

-----------------------------------------------------
<?php

class Another extends Something {
var $y;
function setY($v) {
$this->y=$v;
}
function getY() {
return $this->y;
}
}

?>---------------------------------------------------

//类的声明(电话类)
class Phone{
 //声明属性
 var $pinPai;
 var $color;
 var $batteryCapacity;
 var $screenSize;

 //成员方法
 function call(){
 
 }

 function message(){

 }

 function playMusic(){

 }

 function photo(){

 }
}

//类的实例化

<?php

class Something {
var $x;

function Something($y) {
$this->x=$y;
}

function setX($v) {
$this->x=$v;
}

function getX() {
return $this->x;
}
}

?>---------------------------------------------------


  所以你可以创建一个对象,通过:

 

 $obj=new Something(6);

  构造函数会自动地把6赋值给数据变量x。构造函数和方法都是普通的PHP函数,所以你可以使用缺省参数。

  

function Something($x="3",$y="5")

  接着:

  

$obj=new Something(); // x=3 and y=5
  $obj=new Something(8); // x=8 and y=5
  $obj=new Something(8,9); // x=8 and y=9

  缺省参数使用C++的方式,所以你不能忽略Y的值,而给X一个缺省参数,参数是从左到右赋值的,如果
传入的参数少于要求的参数时,其作的将使用缺省参数。

  当一个派生类的对象被创建时,只有它的构造函数被调用,父类的构造函数没被调用,如果你想调用基
类的构造函数,你必须要在派生类的构造函数中显示调用。可以这样做是因为在派生类中所有父类的方法都
是可用的。

-----------------------------------------------------

<?php

function Another() {
$this->y=5;
$this->Something();
//显示调用基类构造函数
}

?>---------------------------------------------------

class Person{

 var $name;
 var $age;
 var $sex;

 function say(){

 }

 function eat(){

 }

 function run(){

 }
}
//实例化
$p1=new Person;
$p2=new Person;
$p3=new Person;

<?php

$obj=new Classfoo();
$str=serialize($obj);

//保存$str到磁盘上


//几个月以后


//从磁盘中装入str

$obj2=unserialize($str)

?>---------------------------------------------------
  你恢复了成员数据,但是不包括方法(根据文档所说)。这导致了只能通过类似于使用$obj2->x来存取
成员变量(你没有别的方法!)的唯一办法,所以不要在家里试它。

//访问对象的成员
$p1->name="zhangsan";
echo $p1->name;
?>

php教程 scandir遍历显示所有文件与文件夹下的文件,方法很简单我们只要利用is_dir判断再递归查找一次,这样就可以把遍历目录下所有文件了。

目录遍历

<?php

  function numfilesindir ($thedir){
    if (is_dir ($thedir)){
      $scanarray = scandir ($thedir);
      for ($i = 0; $i < count ($scanarray); $i++){
        if ($scanarray[$i] != "." && $scanarray[$i] != ".."){
          if (is_file ($thedir . "/" . $scanarray[$i])){
            echo $scanarray[$i] . "<br />";
          }
        }
      }
    } else {
      echo "Sorry, this directory does not exist.";
    }
  }
  echo numfilesindir ("sample1");

?>

扫描指定位置的文件

<?php
   print_r(scandir("/usr/local/apache2/htdocs"));
?>

<?
    $files = scandir(".", 1);
    var_dump($files);
?>

cookie 是由服务器发送到浏览器的变量。cookie 通常是服务器嵌入到用户计算机中的小文本文件。每当计算机通过浏览器请求一个页面,就会发送这个 cookie。

实例

<?php教程

  echo( "Cookie created? : " . setcookie("cookie_name", "cookie_data" ) );

?>

<html>

 <head>
  <title>Cookie</title>
 </head>

 <body>

 </body>

</html>


如果要删除 cookie只要设置cookie的过期时间就行了,
实例

<?php
setcookie ( "cookie_user", "test", time () + 60 * 60 * 24 * 30 );
setcookie ( "cookie_pass", md5 ( "test" ), time () + 60 * 60 * 24 * 30 );

function logout() {
  setcookie ( "cookie_user", "", time () + 60 * 60 * 24 * 30 );
  setcookie ( "cookie_pass", "", time () + 60 * 60 * 24 * 30 );
}
logout ();
echo $_COOKIE ['cookie_user'] . "<br />";
echo "You have successfully logged out.";
?>

我们在开发中经常会用到cookie自动登录

实例

 

<?php
  $GLOBALS['username'] = "test";
  $GLOBALS['password'] = "test";
 
  function validatelogin ($username, $password){
    if (strcmp ($username, $GLOBALS['username']) == 0 && strcmp ($password, $GLOBALS['password']) == 0){
      setcookie ("cookie_user", $username, time()+60*60*24*30);
      setcookie ("cookie_pass", md5 ($password), time()+60*60*24*30);
      return true;
    } else {
      return false;
    }
  }
  if (validatelogin ("test","test")){
    echo "Successfully logged in.";
  } else {
    echo "Sorry, invalid login.";
  }
?>

[!--infotagslink--]

相关文章

  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • Python 图片转数组,二进制互转操作

    这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • C#中using的三种用法

    using 指令有两个用途: 允许在命名空间中使用类型,以便您不必限定在该命名空间中使用的类型。 为命名空间创建别名。 using 关键字还用来创建 using 语句 定义一个范围,将在此...2020-06-25
  • 源码分析系列之json_encode()如何转化一个对象

    这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
  • php中去除文字内容中所有html代码

    PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
  • php数组操作 键名比较 差集 交集赋值

    本文章提供在量的数据中级操作实例有如对键名比较计算数组的差集 计算差集 给指定数组中插入一个元素 反转数组 交集赋值新的数组实例。 //定义回调函数 funct...2016-11-25
  • C#二维数组基本用法实例

    这篇文章主要介绍了C#二维数组基本用法,以实例形式分析了C#中二维数组的定义、初始化、遍历及打印等用法,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • php curl模拟post请求和提交多维数组的示例代码

    下面一段代码给大家介绍php curl模拟post请求的示例代码,具体代码如下: <&#63;php$uri = "http://www.cnblogs.com/test.php";//这里换成自己的服务器的地址// 参数数组$data = array ( 'name' => 'tanteng'// 'passwor...2015-11-24
  • C#数组的常用操作方法小结

    Array数组在C#中同样是最基本的数据结构,下面为大家C#数组的常用操作方法小结,皆为细小的代码段,欢迎收看收藏...2020-06-25
  • C#实现字符串转换成字节数组的简单实现方法

    这篇文章主要介绍了C#实现字符串转换成字节数组的简单实现方法,仅一行代码即可搞定,非常简单实用,需要的朋友可以参考下...2020-06-25
  • index.php怎么打开?如何打开index.php?

    index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06
  • C# 拷贝数组的几种方法(总结)

    下面小编就为大家带来一篇C# 拷贝数组的几种方法(总结)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • PHP 二维数组根据某个字段排序的具体实现

    本文记录的要实现的功能类似于 MySQL 中的 ORDER BY,上个项目中有遇到这样的一个需求。 要求:从两个不同的表中获取各自的4条数据,然后整合(array_merge)成一个数组,再根据数据的创建时间降序排序取前4条。 遇到这个...2014-06-07
  • c#将字节数组转成易读的字符串的实现

    这篇文章主要介绍了c#将字节数组转成易读的字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • C#读取文件所有行到数组的方法

    这篇文章主要介绍了C#读取文件所有行到数组的方法,涉及C#针对文件及数组的相关操作技巧,需要的朋友可以参考下...2020-06-25
  • PHP中func_get_args(),func_get_arg(),func_num_args()的区别

    复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04
  • 将二维数组转为一维数组的2种方法

    如何将下面的二维数组转为一维数组。复制代码 代码如下:$msg = array(  array(    'id'=>'45',    'name'=>'jack'  ),  array(    'id'=>'34',    'name'=>'mary'  ),  array(    'id...2014-05-31
  • php中数组写入文件方法

    在php中为我们提供了一个函数var_export 他可以直接将php代码入到一个文件中哦。 代码如下 复制代码 var_export($times,true);后面不加tru...2016-11-25
  • PHP编程 SSO详细介绍及简单实例

    这篇文章主要介绍了PHP编程 SSO详细介绍及简单实例的相关资料,这里介绍了三种模式跨子域单点登陆、完全跨单点域登陆、站群共享身份认证,需要的朋友可以参考下...2017-01-25
  • PHP 如何获取二维数组中某个key的集合

    本文为代码分享,也是在工作中看到一些“大牛”的代码,做做分享。 具体是这样的,如下一个二维数组,是从库中读取出来的。 代码清单: 复制代码 代码如下: $user = array( 0 => array( 'id' => 1, 'name' => '张三', 'ema...2014-06-07