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"
}

关联数组中每个元素的关键部分可以是任何数字(整数、浮点数或布尔值)或字符串。value 部分可以是任何类型。但是,浮点键被强制转换为整数。因此,布尔值 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

要使用 forwhile 或 do-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

使用 Key 访问 Value

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

在下面的代码中,声明了一个关联数组 $arr 1。创建另一个数组 $arr 2 ,以便它存储 $arr 1 中的每对,每个键的值加倍。

<?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() 函数以易于理解的人类可读形式显示存储在数组中的数据。