PHP是变量、数组还是对象?

33

我试图弄清楚如何使用PHP实现类似于我在JavaScript中所做的事情的等价物。但我不确定要使用哪些运算符。在JavaScript中,我想查看传递的特定参数是对象还是数组..如果不是,则它是一个字符串/整数,我所做的是类似于:

if (str instanceof Array || str instanceof Object) 
{
   //code
}
else
{
   //code
}

有人知道 PHP 中相当于此的等效方法吗?

6个回答

79
使用is_array函数来检查一个变量是否为数组,同样地,使用is_object函数来检查一个变量是否为对象。

是的,这很有趣。我一打字就想起了is_array,然后我查找了一下是否有类似于对象的东西。今天我显然非常聪明,谢谢。顺便问一下,是否有类似于JSON的东西,因为我想将其加入我的混合中,以便根据需要进行解码/编码。 - chris
3
我可以尝试使用json_decode对其进行解码,如果失败了,则不是 JSON。 - Ry-
1
你不应该过早地进行优化,但如果在分析后 is_array($var) 成为瓶颈,那么 (array) $var === $var 的性能更高。 - rgvcorley

12

尝试使用:

if (!is_scalar($var)) {
    // Varible is object or array
}

1
“资源”类型怎么样? - OMA
2
正如 @OMA 所提到的,这将匹配 NULL 和资源。 - Yarik Dot
PHP.net表示:注意:is_scalar()不认为资源类型的值是标量,因为资源是抽象数据类型,目前基于整数。这个实现细节不应该被依赖,因为它可能会改变。 - Theodore R. Smith

1

1

PHP >= 8.1

从 PHP 8.1 及以上版本开始,您可以使用以下内容:

array_is_list($array)

https://www.php.net/manual/zh/function.array-is-list.php


PHP < 8.1

纯 is_array/is_object 无法判断,因为:

is_array([0,1,2,3]) // true
is_object([0,1,2,3]) // false

is_array(['a'=>1,'b'=>2]) // true
is_object(['a'=>1,'b'=>2]) // false

我编写了一个简单的函数来完成这个任务。

function isRealObject($arrOrObject) {
    if (is_object($arrOrObject))
        return true;
    $keys = array_keys($arrOrObject);
    return implode('', $keys) != implode(range(0, count($keys)-1));
}

1
你有点晚了,https://www.php.net/manual/zh/function.array-is-list.php - Your Common Sense
是啊...刚刚注意到这个新方法,我们仍在使用7.x版本。 - Del Xiong
1
这个答案在技术上是不正确的,因为即使PHP中的数组具有数字键的间隙或是关联数组,它仍然是一个数组。为什么这个答案会被点赞?当所需的粘合剂是空字符串时,可以省略implode()函数的粘合剂参数。看起来你发错了页面。https://dev59.com/5HVC5IYBdhLWcg3w1Etq已经涵盖了你想要讨论的主题。 - mickmackusa
@mickmackusa 是的,但这应该是 PHP 中的一个历史性问题,在大多数编程语言中,列表数组和对象显然是不同的。 如果你在 MySQL8 中调用 json_object/json_array,你就会知道为什么我们关注这个问题。 - Del Xiong

0
从PHP 8.0开始,编写函数时可以使用联合类型,在运行时验证参数的类型:
function test(array|object $something): void
{
    // Here, $something is either an array or an object
}

这个回答忽略了被问的问题中有一个else分支来处理非数组/非对象的数据。 - undefined

0

对象(使用 is_object)-----

stdClass Object
(
    [rest_food_items_id] => 137
    [rest_user_id] => 42
)

数组(使用 is_array)----
Array
(
    [rest_food_items_id] => 137
    [rest_user_id] => 42
)

**

例子

**

if(is_object($data)){

}
if(is_array($data)){

}

这是正确的,用于检查对象中的数组,并且对于数组是正常的。 - Vishal Mohan
接受的答案早在5年前的这个页面上已经提供了这些见解。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接