我想知道变量是否是一个集合。
我不能使用is_object(),因为即使它不是集合也是如此。 现在我使用它,它的工作原理:
if(is_object($images) && get_class($images) != 'Illuminate\Database\Eloquent\Collection') {
但我认为这太丑了,我花时间问你另一种解决方案。
你有什么想法吗?
答案 0 :(得分:30)
你不能使用
if(is_a($images, 'Illuminate\Database\Eloquent\Collection')) {
....do whatever for a collection....
} else {
....do whatever for not a collection....
}
或
if ($images instanceof Illuminate\Database\Eloquent\Collection) {
}
答案 1 :(得分:17)
The class being used is incorrect here. In a general sense, you should be testing for the base class.
use Illuminate\Support\Collection;
....
if($images instanceof Collection) {
....
}
答案 2 :(得分:3)
@Konchong 的回答指出了这一点,但我想对其他人做出明确说明。
Illuminate\Support\Collection
是 Laravel 中许多类型集合使用的基类,而 Illuminate\Database\Eloquent\Collection
是扩展基类但具有附加功能的基类,在其代码中,将基类作为别名类作为 BaseCollection。这就是您通过模型类和get() 之类的函数执行查询构建器时获得的结果。一个普通的集合是用 collect(["my", "array"])
代替的。
请注意,这两个类都会产生一组不同的方法。例如,load、loadMissingRelation 和许多其他方法存在于子类中,而父类中不存在。然而,在数据库子类中的方法内部,有许多转义舱 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"]));
请注意,虽然集合本质上是数组的包装器并具有非常强大的方法,但它不是数组,并且在标准 php 数组函数中经常会失败或抛出异常。
答案 3 :(得分:2)
function is_collection($param): bool
{
return (bool) (($param instanceof \Illuminate\Support\Collection) || ($param instanceof \Illuminate\Database\Eloquent\Collection));
}
如果你经常使用它,你可能只想为它制作函数。
@Konchog 和@Jonathan Ma 的组合回答。
答案 4 :(得分:-2)
对我来说,使用is_countable可行:
if(is_countable($somethingCountable)) {
// do something with array
} else {
// print something else
}