探讨PHP:数组、关联数组、stdClass、哈希表

概述

1、PHP中的数组比较特别,既可以当成普通数组来使用,也可以当成关联数组(HashTable)来使用。

2、PHP中没有专门的哈希表(HashTable)实现,用关联数组即可。
3、PHP5开始提供内置类stdClass,可当作哈希表来使用。

文章目录

      • 概述
      • 普通数组
      • 关联数组
      • stdClass
      • 注意
      • 问题:如何得到一个空的关联数组(Map)?
      • 列表转Map工具方法:array2Map

普通数组

// php5
$arr = array();
// php7
$arr = [];

// 普通数组
$arr = array();
$arr[0] = 'a';
$arr[1] = 'b';
echo json_encode($arr);//["a","b"]
array_push($arr, 'c');
echo json_encode($arr);//["a","b","c"]

使用字符串形式的"下标"也是可以的:

$arr = array();
$arr['0'] = 'a';
$arr['1'] = 'b';
echo json_encode($arr);//["a","b"]

关联数组

$arr = array();
$arr['1'] = 'b';
$arr['0'] = 'a';
echo json_encode($arr);//{"1":"b","0":"a"}

$arr = array(
    "1" => "one",
    "2" => "two"
);
$arr['3'] = "three";
echo json_encode($arr);//{"1":"one","2":"two","3":"three"}

stdClass

$obj = new stdClass();
$obj->x = 'x';
$obj->y = 'y';
echo json_encode($obj);//{"x":"x","y":"y"}

$obj = new stdClass();
$x = '0';
$obj->$x = 'x';
$y = '1';
$obj->$y = 'y';
echo json_encode($obj);//{"0":"x","1":"y"}

通过stdClass new出来的对象,可以直接访问对象的成员。stdClass对象,可动态给对象追加设置属性,在动态对象创建中很有用。

注意

普通数组的初始化过程相当严苛,定义好数组变量后,必须按照下标为0,1,2,3,…的顺序,不间断地赋值,最终得到的才是一个普通数组,否则都会按关联数组对待。

  1. 下标不连续赋值,得到的是关联数组。
$arr = array();
$arr[0] = 'a';
$arr[2] = 'c';
echo_json($arr);//{"0":"a","2":"c"}
  1. 下标未按顺序赋值,得到的是关联数组。
$arr = array();
$arr[1] = 'b';
$arr[0] = 'a';//{"1":"b","0":"a"}
echo_json($arr);

问题:如何得到一个空的关联数组(Map)?

通过$arr = array()定义的数组,会随着后续添加元素的方式不同而成为普通数组,或者关联数组。

有没有办法确保得到的是一个关联数组呢?

也就是说,后续哪怕我按照下标顺序顺序赋值后,依然是一个关联数组。

目前,我想到的方式是:

$arr = array(
    "__foo__"=>"bar"
);//定义时,额外指定一组key-value,确保得到的是一个关联数组
$arr['0'] = '0';
$arr['1'] = '1';
echo_json($arr);//{"foo":"bar","0":"0","1":"1"}

列表转Map工具方法:array2Map

综上,可以写出一个工具方法,将一个列表转成一个关联数组:

public static function array2Map($datas, $key, $val) {
	$map = array(
		"__foo__" => "bar"
	);
	for($i=0;$i<count($datas);$i++) {
		$item = $datas[$i];
		$map[$item[$key]] = $item[$val];
	}
	return $map;
}

你可能感兴趣的:(#,PHP,php数组,php关联数组,php空关联数组,php定义空数组,php,stdClass)