PHP学习3

PHP数组

PHP中的数组实际上是一个有序映射。映射是一种把values关联到keys的类型。此类型在很多方面做了优化,因此可以把它当从真正的数组,或列表(向量),散列表,字典,集合,栈,队列以及更多可能性。数组元素的值也可以是另一个数组。树形结构和多维数组也是允许的。

语法

定义数组array( )

可以用array( )语言结构来新建一个array。它接受任意数量用逗号分隔的键(key)=>值(value)对。

array(key=>value)
//键(key)可是是一个整数(integer)或字符串(string)
//值(value)可以是任意类型的值
<?php
$arr = array("foo"=>"bar", 12=>true);

echo $arr["foo"]; //bar
echo $arr[12]; //1
?>

key可以是integer或者string。如果key是一个integer的标准表示,则被解释为整数(例如"8"将被解释为8,而"08"将被解释为"08")。key中的浮点数被取整为integer。在PHP中索引数组与关联数组是相同的,他们都可以同时包含整型和字符串的下标。
值可以是任意的PHP类型。

<?php
$arr = array("somearray"=>array(6=>5, 13=>9, "a"=>42));

echo $array["somearray"][6]; //5
echo $array["somearray"][13]; //9
echo $array["somearray"][a]; //42
?>

如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是键名该值加一。如果指定的键名已经有了值,则该值会被覆盖。

<?php
//这个数组与下面的数组相同....
array(5=>43, 32, 56, "b"=>12);

//...
array(5=>43, 6=>32, 7=>56, "b"=>12);
?>

Warning

自PHP4.3.0起,上述的索引生成方法改变了。如今如果给一个当前最大键名是负值的数组添加一个新值,则新生成的索引将为(0)。以前新生成的索引为当前最大索引加一,和正值的索引相同。
使用TRUE作为键名将使integer1成为键名。使用FALSE作为键名将使integer0成为键名。使用NULL作为键名将等同于使用空字符串。使用空字符串作为键名将新建(或覆盖)一个用空字符串作为键名的值,这和用空的方括号不一样。
不能用数组和对象作为键(key)。这样会导致一个警告:Illegal offset type。

用方括号的语法新建/修改

可以通过明示的设定值来改变一个现有的数组。
这是通过在方括号内指定键名来给数组赋值实现的。也可以省略键名,在这种情况下给变量名加上一对空的方括号("[]")。

$arr[key] = value;
$arr[] = value;
//key可以是integer或string
//value可以是任意类型的值

如果$arr还不存在,将会新建一个。这也是一种定义数组的替换方法。要改变一个值,只要给它赋一个新值。如果要删除一个键名/值对,要对它用unset()。

<?php
  $arr = array(5 => 1, 12 => 2);
  $arr[] = 56;  //This is the same as $arr[13] = 56;
                    // at this point of the script
  $arr["x"] = 42;  //This adds a new element to
                        //the array with key "x"
   unset($arr[5]);  //This removes the element from the array
   unset($arr);  //This deletes the whole array
?>
NOTE:
如上所述,如果给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值 + 1。如果当前还没有整数索引,则键名将为 0。如果指定的键名已经有值了,该值将被覆盖。
注意这里所使用的最大整数键名不一定当前就在数组中。它只要在上次数组重新生成索引后曾经存在过就行了。以下面的例子来说明:
<?php
//创建一个简单的数组
$array = array(1, 2, 3, 4, 5);
print_r($array);

//现在删除其中的所有元素,但保持数组本身不变:
foreach ($array as $i => $value){
  unset($array[$i]);
}
print_r($array);

//添加一个单元(注意新的键名是5,而不是你可能以为的0)
$array[] = 6;
print_r($array);

//重新索引
$array = array_values($array);
$array[] = 7;
print_r($array);
?>

以上例子会输出:

Array(
  [0] => 1
  [1] => 2
  [2] => 3
  [3] => 4
  [4] => 5
)
Array(
)
Array(
  [5] => 6
)
Array(
  [0] => 6
  [1] => 7
)

实用函数

Note:

unset()函数允许删除数组中的某个键。但要注意数组将不会重建索引。If a true "remove and shift" behavior is desired, the array can be reindexed using the array_values() function.

<?php
 $a = array(1=> 'one', 2 => 'two', 3 => 'three');
unset($a[2]);
/*will produce an array that would have been defined as
   $a = array(1=> 'one', 3 => 'three');
   and NOT
   $a = array(1 => 'one', 2=>'three');
*/

  $b = array_values($a);
  //Now $b is array(0=>'one', 1=>'three')
?>

foreach控制结构是专门用于数组的。它提供了一个简单的方法来遍历数组。

PHP对象

要创建一个新的对象object,使用new语句实例化一个类:
<?php
class foo{
function do_foo(){
echo "Doing foo.";
}
}

$bar = new foo;
$bar->do_foo();
?>

转换为对象

如果将一个对象转换成对象,它将不会有任何变化。如果其它任何类型的值被转换成对象,将会实例化一个内置类stdClass的对象。如果该值为NULL,则新的实例为空。数组转换成对象将使键名成为属性名并具有相对应的值。对于任何其他的值,名为scalar的成员变量将包含该值。

<?php
  $obj = (object) 'ciao';
  echo $obj->scalar;  //outputs 'ciao'
?>

PHP资源类型

资源是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。
Note:资源类型是PHP4引进的。

PHP NULL

特殊的NULL值表示一个变量没有值。NULL类型唯一可能的值就是NULL。
Note:NULL类型是PHP4引进的。

在下列情况下一个变量被认为是NULL:
+被赋值为NULL
+尚未被赋值
+被unset( )

语法

NULL类型只有一个值,就是大小写不敏感的关键字NULL。

<?php
$var = NULL;
?>

转换到NULL

将一个变量转换为null类型将会删除该变量并且unset它的值。

PHP本文档中使用的伪类型

mixed

mixed说明一个参数可以接受所有的PHP类型,str_replace()可以接受字符串和数组。

number

number说明一个参数可以是unteger或float。

callback

有些诸如call_user_function( )或usort( )的函数接受用户自定义的函数作为一个参数。Callback函数不仅可以是一个简单的函数,它还可以是一个对象的方法,包括静态类的方法。
一个PHP函数用函数名字来传递。可以传递任何内置的或者用户自定义的函数,除了语言结构如array( ), echo( ), empty( ), eval( ), exit( ), isset( ), list( ), print( )和unset( )。
一个对象的方法以数组的形式来传递,数组的下标0指明对象名,下标1指明方法名。
对于没有实例化为对象的静态类,要传递其方法,将数组0下标指明的对象名换成该类的名称即可。
除了普通的用户定义的函数外,也可以使用create_function( )来创建一个匿名的回调函数(callback)。

Example #1 回调函数(callback)示例

<?php
//普通的回调函数
function my_callback_function(){
  echo 'hello world!';
}

//回调方法
function MyClass{
  static function myCallbackMethod(){
     echo 'Hello World!';
  }
}

//Type 1: Simple callback
call_user_func('my_callback_function');

//Type 2: Static class method call
call_user_func(array('MyClass', 'myCallbackMethod'));

//Type 3: Object method call
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));

//Type 4: Static class method call (As of PHP 5.2.3)
call_user_func('MyClass::myCallbackMethod');

//Type 5: Realtive static class method call(As of PHP 5.3.0)
class A{
  public static function who(){
     echo "A";
  }
}

class B extends A{
  public static function who(){
        echo "B";
   }
}

call_user_func(array('B', 'parent::who'));  //A
?>

Note:

在 PHP4 中,必须使用引用来创建一个指向实际object,而不是它的一个拷贝。详情请见引用的解释。 In PHP4, it was necessary to use a reference to create a callback that points to the actual object, and not a copy of it. For more details, see References Explained.

void

void作为返回类型意味着函数的返回值是无用的。void作为参数列表意味着函数不接受任何参数。

...

在函数原型中,$...表示等等的意思。当一个函数可以接受任意个参数时使用此变量名。

PHP类型转换的判别
PHP在变量定义中不需要(或不支持)明确的类型定义;变量类型是根据使用该变量的上下文说决定的。也就是说,如果把一个字符串值赋给变量var,var就成了一个字符串。如果又把一个整型值赋给var,那它就成了一个整数。
PHP的自动类型转换的一个例子是号"+"。如果任何一个操作数是浮点数,则所有的操作数都被当成浮点数,结果也是浮点数。否则操作数会被解释为整数,结果也是整数注意这并没有改变这些操作数本身的类型;改变的仅是这些操作数如何被求值以及表达式本身的类型。

<?php
$foo = "0";  // $foo 是字符串 (ASCII 48)
$foo += 2;   // $foo 现在是一个整数 (2)
$foo = $foo + 1.3;  // $foo 现在是一个浮点数 (3.3)
$foo = 5 + "10 Little Piggies"; // $foo 是整数 (15)
$foo = 5 + "10 Small Pigs";     // $foo 是整数 (15)
?>

类型强制转换

PHP中的类型强制转换和C中的非常像:在要转换的变量之前加上用括号括起来的目标类型。

<?php
$foo = 10;   // $foo is an integer
$bar = (boolean) $foo;   // $bar is a boolean
?>

允许的强制转换有:
+(int), (integer) - 转换为 整型(integer)
+(bool), (boolean) - 转换为 布尔型(boolean)
+(float),(double),(real) - 转换为浮点型(float)
+(string) - 转换为字符串(string)
+(binary) - 转换为二进制字符串(string)(PHP 6)
+(array) - 转换为数组(array)
+(object) - 转换为对象(object)
+(unset) - 转换为NULL(PHP 5)

(binary)转换会在结果前面加上前缀'b',PHP 5.2.1新增。

注意在括号内允许有空格和制表符,所以下面两个例子的功能相同:

<?php
$foo = (int) $bar;
$foo = (int) $bar;
?>

将字符串(string)文字和变量转换为二进制字符串(string):

<?php
$binary = (binary)$string;
$binary = b"binary stirng";
?>

Note:

可以将变量放置在双引号的方式来代替将变量转换成字符串(string):

<?php
$foo = 10;  //$foo是一个整数
$str = "$foo";  //$str是一个字符串
$fst = (string)$foo;  //$fst也是一个字符串

//输出"they are the same"
if($fst == $str){
   echo "they are the same";
}
?>

有时在类型之间强制转换时确切的会发生什么可能不是很明显。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • PHP常用函数大全 usleep() 函数延迟代码执行若干微秒。 unpack() 函数从二进制字符串对数据进行解...
    上街买菜丶迷倒老太阅读 1,352评论 0 20
  • php usleep() 函数延迟代码执行若干微秒。 unpack() 函数从二进制字符串对数据进行解包。 uni...
    思梦PHP阅读 1,981评论 1 24
  • 一、php可以做什么 php是一种可以在服务器端运行的编程语言,可以运行在Web服务器端。 php是一门后台编程语...
    空谷悠阅读 3,086评论 4 97
  • 最近在读古典老师的《跃迁—成为高手的技术》,本书主要是让我们看到并学习,高手是如何利用选择背后隐藏的规律,进而有意...
    小马老师_faith阅读 553评论 2 6
  • 今天走亲访友,一个25岁的小姑娘居然给我说:“唉,春节回来又被爸爸妈妈逼婚,真的快疯了,实在不行你随随便便给我介绍...
    冰红茶麻麻阅读 436评论 10 36