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);
}
php
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 21

// 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'; }

3个月前 评论
1043874660 (楼主) 3个月前

还以为干嘛呢,不就是区分索引数组和关联数组

还有 json_encode 第二个参数 true 是什么鬼哦,你是不是搞错了 encode 和 decode?

3个月前 评论
1043874660 (楼主) 3个月前
乘马班如 (作者) 3个月前
$arr = array();
$arr[] = 'test';
$arr['cc'] = 'bbb';

判断成什么呢?

3个月前 评论
1043874660 (楼主) 3个月前
tuesdays (作者) 3个月前

这个的判断实用性意义不大吧,
你说用在接口对接里吧,都有接口文档规定了输入输出格式,
亦或用在数据存储,那也会取值使用,也会默认一套格式,
都是二者取其一。
总不存在一套代码里的数据格式会发生变换吧

3个月前 评论
tuesdays 3个月前
1043874660 (楼主) 2个月前

php是弱类型语言,所以一切皆数组

3个月前 评论
1043874660 (楼主) 3个月前

PHP 8.1 就添加了一个 array_is_list 来解决你这个问题了。

如果你一时不能升级到 8.1 也不用担心,Symfony 创建一个 polyfill 来处理。

核心代码如下:

public static function array_is_list(array $array): bool
    {
        if ([] === $array || $array === array_values($array)) {
            return true;
        }

        $nextKey = -1;

        foreach ($array as $k => $v) {
            if ($k !== ++$nextKey) {
                return false;
            }
        }

        return true;
    }
3个月前 评论
Rache1 (作者) 3个月前
1043874660 (楼主) 3个月前
tuesdays 3个月前

json_decode的第二传参true和false不是可以控制为你想的返回的数据格式吗?为什么还要这样判断是否为数组和对象? 如:$str = {"a":1,"b":2,"c":3}; $arr = json_decode($str,true); //第二个参数为true则返回的一定是数组格式。 $obj = json_decode($str,false); //第二个参数为false则返回的一定是对象格式。

2个月前 评论
1043874660 (楼主) 2个月前

这不能通过encode 后的字符串 首个字符 是不是 { 来判断吗?

1个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
1
粉丝
0
喜欢
1
收藏
0
排名:2756
访问:318
私信
所有博文
博客标签
社区赞助商