PHP 数组对象判断
在php开发中,json_encode和json_decode都是常用的方法,但是我们传入json到php中进行解析,不管是传入数组还是传入对象,在php中解析出来都是array类型,所以在做某些操作时我们可能要根据传入的json类型做不同操作就比较麻烦了,所以有了这个方法。
这样的json我们叫它数组
[1,2,3]
这样的json我们叫它对象
{"a":1,"b":2,"c":3}
但是通过getType()方法拿到的都是array类型
$a = [0, 1, 2, 3];
$b = ['a' => 0, 'b' => 1, 'c' => 3];
$c = [['a' => 1], ['b' => 2], 'c' => 3];
echo gettype($a) . ' data:' . json_encode($a) . PHP_EOL; // array
echo gettype($b) . ' data:' . json_encode($b) . PHP_EOL; // array
echo gettype($c) . ' data:' . json_encode($c) . PHP_EOL; // array
通过对数组索引的判断,如果是数组,那么索引一定是 0-(n-1) ,所以我们可以通过这样推断它是array还是object类型
/**
* 判断是否对象型数组
* @desc 例如$a = [1,2,3]; $b={'a'=>1,'b'=>2} 在php中解析出来都叫做数组,实则$b应该是对象,但是在php的getType()方法返回的类型都是array
* @param array $array
* @return bool
* @author pengzhongyu
* @datetime 2024-11-01
*/
function isArrayObject(array $array): bool
{
return array_keys($array) !== range(0, count($array) - 1);
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
// is_object和is_array方法组合判断呢? $data = array('name' => 'John', 'age' => 25); $obj = (object) $data; if (is_object($obj)) { var_dump($obj); } else { echo 'obj is not an object'; }
还以为干嘛呢,不就是区分索引数组和关联数组
还有
json_encode
第二个参数 true 是什么鬼哦,你是不是搞错了 encode 和 decode?判断成什么呢?
这个的判断实用性意义不大吧,
你说用在接口对接里吧,都有接口文档规定了输入输出格式,
亦或用在数据存储,那也会取值使用,也会默认一套格式,
都是二者取其一。
总不存在一套代码里的数据格式会发生变换吧
php是弱类型语言,所以一切皆数组
PHP 8.1 就添加了一个 array_is_list 来解决你这个问题了。
如果你一时不能升级到 8.1 也不用担心,Symfony 创建一个 polyfill 来处理。
核心代码如下:
json_decode的第二传参true和false不是可以控制为你想的返回的数据格式吗?为什么还要这样判断是否为数组和对象? 如:$str = {"a":1,"b":2,"c":3}; $arr = json_decode($str,true); //第二个参数为true则返回的一定是数组格式。 $obj = json_decode($str,false); //第二个参数为false则返回的一定是对象格式。
php 数组黑盒
这不能通过encode 后的字符串 首个字符 是不是 { 来判断吗?