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

本文介绍了PHP中数组的两种主要类型:普通数组和关联数组,并展示了它们的使用方式。关联数组在PHP中相当于哈希表,而从PHP5开始,可以通过stdClass类创建类似哈希表的对象。同时,文章讨论了如何确保创建关联数组,以及提供了列表转成关联数组的工具方法。
摘要由CSDN通过智能技术生成

概述

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,…的顺序,不间断地赋值,最终得到的才是一个普通数组,否则都会按关联数组对待。

  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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值