概述
1、PHP
中的数组比较特别,既可以当成普通数组来使用,也可以当成关联数组(HashTable)来使用。
2、PHP
中没有专门的哈希表(HashTable)实现,用关联数组即可。
3、PHP5开始提供内置类stdClass,可当作哈希表来使用。
普通数组
// 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,…的顺序,不间断地赋值,最终得到的才是一个普通数组,否则都会按关联数组对待。
- 下标不连续赋值,得到的是关联数组。
$arr = array();
$arr[0] = 'a';
$arr[2] = 'c';
echo_json($arr);//{"0":"a","2":"c"}
- 下标未按顺序赋值,得到的是关联数组。
$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;
}