PHP中的数组

[Toc]

标量变量 只能存储单个数值。 数组(复合类型) 是一个可以存储一组或一系列数值的数据集合。

一、数组声明

先思考一个问题:如何检测一个变量是否是数组

  • 存储在数组中的值称为数组元素,又叫键值
  • 每个数组元素有一个相关的索引(下标/键名),用它可以来访问元素。
//声明一个空数组
$arr = array();
//PHP5.4+
$arr2 = [];
//声明一个多个元素的数组
$nvshen = array('白晶晶','紫霞','春三十娘','如花');
//PHP5.4+
$nvshen = ['白晶晶','紫霞','春三十娘','如花'];

二、数组的分类

索引数组:下标是数字的 关联数组:下标是字符串

1、索引数组

$nvshen = ['白晶晶','紫霞','春三十娘','如花'];
//自动创建索引数组
$newArray = range(0, 10,2);
var_dump($newArray);

2、关联数组

$role = ['mo'=>'白晶晶','zhuyin'=>'紫霞'];
$role['zhou'] = '至尊宝';

3、多维数组

数组中的元素仍为数组,就构成了包含数组元素的数组,即多维数组

$products = array(
    'iphone' => array('iphone5','iphone6','iphone7'),
    'xiaomi' => array('mi1','mi2','mi3'),
    'huawei' => array('hw1','hw2')
);

$cars = array(
  array("Volvo",22,18),
  array("BMW",15,13),
  array("Saab",5,2),
  array("Land Rover",17,15)
);

echo $cars[0][0].": 库存:".$cars[0][1].", 销量:".$cars[0][2].".<br>";
echo $cars[1][0].": 库存:".$cars[1][1].", 销量:".$cars[1][2].".<br>";
echo $cars[2][0].": 库存:".$cars[2][1].", 销量:".$cars[2][2].".<br>";
echo $cars[3][0].": 库存:".$cars[3][1].", 销量:".$cars[3][2].".<br>";

三、动态生成数组

$nvshen = array('白晶晶','紫霞','春三十娘','如花');
$nvshen[4] = '二当家的';
$nvshen[5] = '观音姐姐';
$nvshen[] = '铁扇公主';
//生成多维数组
$nvshen[][] = '牛夫人';

$arr = ['key'=>'string','hello'=>'world','abc'=>['string','hello',1,34.56]];
//$arr['abc']['niai'] = '铁锤妹妹';

四、操作数组

1、直接使用下标

echo $newArray[0];
echo $newArray['product']['brand']['model'];

2、使用循环遍历

2.1、使用for循环来循环索引数组

$indexCount = count($nvshen);
for ($i = 0; $i < $indexCount; $i++) {
    echo $nvshen[$i],'<hr/>';
}

2.2、使用数组专用的foreach遍历关联数组(推荐)

foreach ($nvshen as $arr){
    echo $arr,'<hr/>';
}
foreach ($role as $key=>$value){
    echo $key.'----'.$value,'<hr/>';
}

五、修改/删除数组元素

//修改
$role = ['mo'=>'白晶晶','zhuyin'=>'紫霞'];
$role['mo'] = '白骨精';
//删除
unset($role['zhou']);
unset($array[0][1]);

六、常用的几个函数(看手册)

  • in_array()
  • sort()
  • array_key_exists()

七、下标和值不得不说的故事

1、下标的强制转换

  • 浮点数会转化为整型
  • 布尔类型的会转化为1/0
  • null转化为空字符串
    $arr = [12.34=>'a',true=>'b',null=>'c'];
    print_r($arr);
    /*
    Array
    (
    [12] => a
    [1] => b
    [] => c
    )
    */
  • 下标为负数情况
    //下标不都为负数,新产生的下标是:最大下标+1
    $score = array(
        -1=>60,
        -2=>50,
        8=>80
    );
    $score[] = 100;
    print_r($score);
    /*
    Array
    (
    [-1] => 60
    [-2] => 50
    [8] => 80
    [9] => 100
    )
    */
    //下标全都为负数 新产生的下标是:0
    $score = array(
        -1=>60,
        -2=>50,
        -8=>80
    );
    $score[] = 100;
    print_r($score);
    /*
    Array
    (
    [-1] => 60
    [-2] => 50
    [-8] => 80
    [0] => 100
    )
    */

2、元素值的强制转换

  • 布尔类型的true会转化为:1
  • 布尔类型的false会转化为:空字符
  • null转化为空字符串
$arr = [true,false,null,12.34];
print_r($arr);
/*
Array
(
    [0] => 1
    [1] =>
    [2] =>
    [3] => 12.34
)
*/