Php Laravel:找出变量是否为集合

Php Laravel:找出变量是否为集合,php,laravel,collections,Php,Laravel,Collections,我想知道一个变量是否是一个集合 我不能使用is_object(),因为即使它不是集合,它也是真的。 现在我用这个,它是有效的: if(is_object($images) && get_class($images) != 'Illuminate\Database\Eloquent\Collection') { 但我觉得这太难看了,我花时间问你另一个解决方案 你知道吗?你不能用 if(is_a($images, 'Illuminate\Database\Eloquent\Coll

我想知道一个变量是否是一个集合

我不能使用is_object(),因为即使它不是集合,它也是真的。 现在我用这个,它是有效的:

if(is_object($images) && get_class($images) != 'Illuminate\Database\Eloquent\Collection') {
但我觉得这太难看了,我花时间问你另一个解决方案

你知道吗?

你不能用

if(is_a($images, 'Illuminate\Database\Eloquent\Collection')) {
    ....do whatever for a collection....
} else {
    ....do whatever for not a collection....
}


只是想纠正我在这个答案上遇到的一个错误

请注意,
instanceof
不包括a(obj)或不带引号的类名称

$images instanceof Illuminate\Database\Eloquent\Collection

另外,有趣的是,使用
instanceof
is_a
相比,在速度/性能上存在差异,但是如果你像我一样,首先在寻找这个问题的答案,这可能与你无关。

这里使用的类是不正确的。 一般来说,您应该测试基类

use Illuminate\Support\Collection;

....
if($images instanceof Collection) { 
 ....
}

对我来说,使用可数工作:

if(is_countable($somethingCountable)) {
// do something with array
} else {
// print something else
}


由@Konchong提供的答案指出了这一点,但我想为其他人明确地做出改变

Laravel中许多类型的集合所使用的基类
illighte\Support\Collection
,与扩展基类但具有附加功能的
illighte\Database\elogent\Collection
之间存在差异,后者将基类别名为BaseCollection。这是通过模型类和函数(如get())执行查询生成器时得到的结果。普通的集合是用
collect([“my”,“array”])
代替的

请注意,这两个类都会产生一组不同的方法。例如,loadloadMissingRelation,以及许多其他方法都存在于父类中不存在的子类中。然而,在数据库子类中的方法内部有许多escape hatch if语句,这些语句确保如果有人无意中使用了子类,而子类指的是基类(例如向集合中添加元素),则集合不会中断

请注意,以下是正确的:

User::get() instanceof \Illuminate\Database\Eloquent\Collection;
User::get() instanceof \Illuminate\Support\Collection;
collect(["hello", "i", "am", "a", "base", "collection"]) instanceof \Illuminate\Support\Collection;
collect(["hello im a", "base collection"]) instanceof \Illuminate\Database\Eloquent\Collection;
is_array(collect(["hello im a", "base collection"]));
请注意,以下为假:

User::get() instanceof \Illuminate\Database\Eloquent\Collection;
User::get() instanceof \Illuminate\Support\Collection;
collect(["hello", "i", "am", "a", "base", "collection"]) instanceof \Illuminate\Support\Collection;
collect(["hello im a", "base collection"]) instanceof \Illuminate\Database\Eloquent\Collection;
is_array(collect(["hello im a", "base collection"]));
请注意,虽然集合本质上是数组的包装器,并且具有非常强大的方法,但它不是数组,通常会在标准php数组函数中失败或抛出异常。

函数是集合($param):bool
{
return(bool)($param instanceof\illumb\Support\Collection)| |($param instanceof\illumb\Database\elount\Collection));
}
如果您经常使用它,您可能只想为它创建函数


@Konchog和@Jonathan Ma answer的组合。

我会将它提取到一个助手函数isCollection()中,并在需要时使用它。可能重复的可能重复的可能重复的可能重复的我可以问一下为什么需要它吗..也许你需要的只是..如果($images!=null).
是自PHP5.0以来一直被弃用的,所以在它工作时,这不是最好的建议,真奇怪。它仍然在PHP7中根据以下内容列出它:它确实将它列为已弃用。我的坏。@Bogdan
is_a
在5.0.0中被弃用,但在5.3.0中被恢复(不再弃用)。然而,考虑到历史,我仍然建议
instanceof
优于
is\u a
。另外,它读起来好一点,哦,我的坏:)。谢谢@patricus.Note:我不得不使用\illumb\Database\elount\Collection(带一个前导反斜杠)…我尝试过is_数组、is_Collection和其他方法,但似乎只有这种方法效果最好@EddyGoh没有名为
is\u collection
的内置PHP函数!顺便说一句,Laravel集合看起来像数组,但它们不是数组,因此,如果对Laravel集合运行
is\u array
,将始终返回
false
is\u countable()
与Laravel
collection
一起工作,但不能保证变量是
集合
实例。事实上,如果$somethingCountable是实现
Countable
的数组或其他对象,它将返回
true