PHP - 关联数组



如果PHP数组中的每个元素都是一个键值对,则这样的数组称为关联数组。在这种类型的数组中,每个值都由其关联的键标识,而不是索引。

  • 关联数组用于实现诸如字典、映射、树等数据结构。

  • 在PHP中,"=>"符号用于建立键及其值之间的关联。

如何在PHP中声明关联数组?

两种声明数组的方法——array()函数和方括号表示法——都可以使用。

$arr1 = array(
   "Maharashtra"=>"Mumbai", 
   "Telangana"=>"Hyderabad", 
   "UP"=>"Lucknow", 
   "Tamilnadu"=>"Chennai"
);

$arr2 = ["Maharashtra"=>"Mumbai", 
   "Telangana"=>"Hyderabad", 
   "UP"=>"Lucknow", 
   "Tamilnadu"=>"Chennai"];

如果我们调用var_dump()函数,以上两个数组将显示相似的结构:

array(4) {
   ["Maharashtra"]=>
   string(6) "Mumbai"
   ["Telangana"]=>
   string(9) "Hyderabad
   ["UP"]=>
   string(7) "Lucknow"
   ["Tamilnadu"]=>
   string(7) "Chennai"
}

关联数组中每个元素的部分可以是任何数字(整数、浮点数或布尔值),也可以是字符串。部分可以是任何类型。但是,浮点键会被强制转换为整数。因此,布尔值true/false用作键"1"或"0"。

示例

看下面的例子:

<?php
   $arr1 = array(
      10=>"hello",
      5.75=>"world",
      -5=>"foo",
      false=>"bar"
   );
   var_dump($arr1);     
?>

它将产生以下输出

array(4) {
  [10]=>
  string(5) "hello"
  [5]=>
  string(5) "world"
  [-5]=>
  string(3) "foo"
  [0]=>
  string(3) "bar"
}

请注意,键5.75被四舍五入为5,键"true"显示为"0"。如果同一个键在数组中出现多次,则最后出现的键值对将被保留,丢弃该键与之前值的关联。

PHP内部即使将索引数组也视为关联数组,其中索引实际上是值的键。这意味着第0个索引处的值的键等于"0",依此类推。对索引数组进行var_dump()也会显示出PHP数组的这种特性。

迭代PHP关联数组

foreach循环是迭代关联数组最简单和理想的方法,尽管其他类型的循环也可以通过一些操作来使用。

示例

让我们看一下foreach循环的实现,每个键值对都解包到两个变量中。

<?php
   $capitals = array(
      "Maharashtra"=>"Mumbai", 
      "Telangana"=>"Hyderabad", 
      "UP"=>"Lucknow", 
      "Tamilnadu"=>"Chennai"
   );

   foreach ($capitals as $k=>$v) {
      echo "Capital of $k is $v \n";
   }
?>

它将产生以下输出

Capital of Maharashtra is Mumbai
Capital of Telangana is Hyderabad
Capital of UP is Lucknow
Capital of Tamilnadu is Chennai

还有另一种在PHP中使用foreach循环的方法,其中每个元素都存储在一个变量中。然后,我们可以使用array_search()分离键和值部分,并在循环体中使用它们。

<?php
   $capitals = array(
      "Maharashtra"=>"Mumbai", 
      "Telangana"=>"Hyderabad", 
      "UP"=>"Lucknow", 
      "Tamilnadu"=>"Chennai"
   );

   foreach ($capitals as $pair) {
      $cap = array_search($pair, $capitals);         
      echo "Capital of $cap is $capitals[$cap] \n";
   }
?>

它将产生以下输出

Capital of Maharashtra is Mumbai 
Capital of Telangana is Hyderabad 
Capital of UP is Lucknow 
Capital of Tamilnadu is Chennai

要使用for、whiledo-while循环,我们必须首先获取所有键的数组(使用array_keys()),找到大小并将其用作循环语法中的测试条件。

示例

以下是使用for循环遍历关联数组的方法:

<?php
   $capitals = array(
      "Maharashtra"=>"Mumbai", 
      "Telangana"=>"Hyderabad", 
      "UP"=>"Lucknow",
      "Tamilnadu"=>"Chennai"
   );
   $keys=array_keys($capitals);

   for ($i=0; $i<count($keys); $i++){
      $cap = $keys[$i];
      echo "Capital of $cap is $capitals[$cap] \n";
   }
?>

它将产生以下输出

Capital of Maharashtra is Mumbai 
Capital of Telangana is Hyderabad 
Capital of UP is Lucknow 
Capital of Tamilnadu is Chennai

使用键访问值

在关联数组中,键是值的标识符,而不是索引。因此,要获取与某个键关联的值,请使用$arr[key]语法。这也可以用来更新某个键的值。

示例

在下面的代码中,声明了一个关联数组$arr1。创建另一个数组$arr2,使得它存储$arr1中的每一对,每个键的值加倍。

<?php
   $arr1 = array("a"=>10, "b"=>20, "c"=>30, "d"=>40);
   foreach ($arr1 as $k=>$v){
      $arr2[$k] = $v*2;
   }
   print_r($arr2);
?>

它将产生以下输出

Array
(
   [a] => 20
   [b] => 40
   [c] => 60
   [d] => 80
)

此处使用的print_r()函数以易于理解的人类可读形式显示存储在数组中的数据。

广告