起步 - 数组

  • 作者:KK

  • 发表日期:2016.3.15


这里专门开设章节讲数组,因为在PHP中,数组这东西可谓是举足轻重啊(说白了其实哪门语言都很重视数组)

它是一种数据类型,和JS基本相似

  • 索引数组

    $arr = []; //定义空数组
    $ids = [1, 2, 3, 99, 'aabb']; //定义一个数组变量,数组里面有5个元素,其中有一个元素是字符串
    $names = ['aa', 'bb', 'cc',]; //数组的最后一个元素可以带有逗号
    	
    echo $ids[4]; //aabb
    echo $names[1]; //bb
    $names[1] = 'qq'; //对索引为1的数组重新赋值
    echo $names[1]; //qq  这是刚刚重新赋的值
    

    在JS那里并不强调这种概念,所谓索引数组就是如果要取第1个元素就要通过0这个下标作为索引将它取出来,比如$names[0]

    简单地理解为是只要下标都是数字的数组就是索引数组


  • 统计元素的个数

    要知道数组里面有多少个元素,使用count函数

    $ids = [44, 873, 132];
    echo count($ids); //结果表示有3个元素
    

    但这里提醒你,有些新手会犯一个错误,就是不小心将一个false的变量或者字符串,数字变量传给count函数了,却得到了1这个结果:

    echo count('abc'); //对一个字符串进行count
    echo count(false); //对逻辑值count
    echo count(true);
    echo count(432423); //对数字
    

    全部结果都是1,原因暂时不解释,你只要知道,count函数对非数组进行统计时会得到数字1就行了,这是个坑!


  • 追加元素

    定义好的数组可以动态地继续增加元素

    $ids = [42, 76];
    echo count($ids); //2个
    $ids[] = 33; //赋值时,在变量后面加一个空的方括号,表示将这个值追加到数组中
    echo '<br/>'; //我只是为了让内容能换行显示
    echo count($ids); //3个
    echo $ids[2]; //33  就是刚加进去的第3个元素
    

  • 判断元素是否存在

    使用isset函数来进行判断

    $ids = [11, 22];
    echo isset($ids[1]); //是否存在索引为1的元素,结果是存在的
    echo '<br/>再来一次:'
    echo isset($ids[2]); //不存在,输出空
    	
    $ids[] = 431;
    echo '<br/>再来一次嘛:'
    echo isset($ids[2]); //存在了
    

  • 关联数组

    在PHP里,数组的索引也可以是字符串

    $user = [
    	'name' => 'jay', //name是索引,jay是值, => 是一个语法符号,符号左边就是索引,右边就是索引值
    	'age' => 33,
    	8 => 'haha', //也可以用数字做索引,同时拥有数字和字符串索引
    ];
    	
    echo $user['name']; //jay ,使用字符串索引时要加单引号或双引号,反正就是用字符串写法
    echo $user['age']; //33
    echo $user[8]; //haha
    	
    $key = 'name';
    echo $user[$key]; //这个和 $user['name'] 效果一样,因为变量 $key 的值就是 name
    

    其实用到字符串做索引时,一般我们不叫它索引数组了,而是叫它关联数组

    而访问关联数组的字符串索引时,比如$user['name']我们一般不叫它name索引什么的,这个我们称为或者key,称为name键,还有的说法叫做字段,这个接触了数据库后就能理解了

    一般键名为字符串的时候,这个字符串都是有特定含义的英文单词以方便我们去记住这个值是什么意思,就像上面的'name'这样,值自然就是一个姓名而不可能是一个数字(当然你也可以顽皮地赋值为数字)


  • 多维数组

    数组里面的值也可以是数组,这就形成了多维数组

    $student = [
    	'name' => 'jay',
    	'school' => [
    		//school这里面又是一个数组
    		'name' => 'xxx school',
    		'city' => 'beijing',
    	],
    	'xxx' => [
    		//xxx键的值也是一个数组
    		'yyy' => [
    			//这里面又是一个数组
    			'zzz' => [...] //更多嵌套,无限深层
    		],
    	],
    ];
    	
    $school = $student['school']; //先把school键的值取出来,它是个数组
    echo $school['city']; //beijing
    echo $student['school']['city']; //和上一句效果一样,就是在后面多加个 [] 来进一步访问school键的值里面的city键
    

    像上例中的xxx键一样,数组里面的值可以无限层嵌套数组


  • 输出数组

    • 基本输出

      在JS里可以用console.log打印整个数组,然后在控制台查看,在PHP里我们也可以查看整个数组的内容,使用print_r函数,上代码:

      $names = ['Jay', 'May', 'Kay'];
      print_r($names);
      

      就会看见以下输出

      Array ( [0] => Jay [1] => May [2] => Kay )
      

      前面的Array表示是一个数组,里面第0个元素的值是Jay,第1个元素的值是May...


    • 排版问题

      我们先试试输出关联数组:

      $school = [
      	'name' => '学校1',
      	'startTime' => '1996年9月1日',
      	'location' => [
      		'province' => '某省',
      		'city' => '某市',
      	],
      ];
      print_r($school);
      

      则输出结果在网页上显示的样子就是:

      Array ( [name] => 学校1校1=> 1996年9月1日=> Array ( [province] => 某省=> 某市

      一般人会觉得这样的输出结果还不如代码好看呢,因为都挤成一行了,能不能按照结构一个元素一行,包住的元素缩进呀...可以的哟!

      办法就是用一个pre标签包住就行了,代码改成这样:

      echo '<pre>';
      $school = [
      	'name' => '学校1',
      	'startTime' => '1996年9月1日',
      	'location' => [
      		'province' => '某省',
      		'city' => '某市',
      	],
      ];
      print_r($school);
      echo '</pre>';
      

      就是在前后输出了pre标签的开始和结束标记就行了,这样输出的数组在浏览器里显示时会自动给你排好版的


  • 访问非数字索引时要注意

    当数组的索引不是数字时就是一个关联数组,我们又将这种数组的下标称为键名,在PHP的旧版本中,访问关联数组的键名可以不用字符串,而是像常量一样直接写名称来访问,比如

    $user = [
    	'name' => '小明',
    	'age' => 18,
    ];
    echo $user[name]; //输出 小明
    

    这样即使没有用单引号写成$user['name']也是可以输出name这个下标的,但这里有一个坑点,如果前面我们定义了一个叫做"name"的常量,这就不同了,再看看代码

    define('name', 'age');
    $user = [
    	'name' => '小明',
    	'age' => 18,
    ];
    echo $user[name]; //输出 18
    

    这是一个坑点,在后来的PHP版本中取消了这个特性,访问数组元素都需要用字符串或数字了,如果像上面这样写的话,新版本的PHP总是会按照常量来查找,而不是当作字符串键名来取值

    结语:你加入一些公司看到一些旧版的PHP代码可能会发现这种不带引号来访问数组键名的写法,只要知道有这回事就好了,你千万不能跟着这样写,而且新版本的PHP也不支持这样写