我正在搜索一个集合,我想让这个搜索不区分大小写,或者至少把集合的值改成小写。我该怎么做?
$value = strtolower($value); $collection = $collection->where($attribute, $value);
$value是小写的,而集合中的内容不是,因此没有匹配项。
vzgqcmou1#
您可以改为使用filter()方法和回调函数来完成您想要的任务:
filter()
$collection = $collection->filter(function ($item) use ($attribute, $value) { return strtolower($item[$attribute]) == strtolower($value); });
1zmg4dgp2#
可以Map集合并将每个项的属性小写:
$value = strtolower($value); $collection = $collection ->map(function ($item) use ($attribute) { $item->{$attribute} = strtolower($item->{$attribute}); return $item; }) ->where($attribute, $value);
vom3gejh3#
我创建了一个集合宏,用于执行不区分大小写的搜索。下面的版本将获取集合中第一个匹配大小写不敏感项的项。将此添加到您的服务提供商:
Collection::macro('insensitiveFirstWhere', function ($key, $value = null) { if (func_num_args() === 1) { $value = true; } else if (is_string($value)) { $value = mb_strtolower($value); } return $this->first(function ($item) use ($key, $value) { $itemValue = $item->{$key}; if (is_string($itemValue)) { $itemValue = mb_strtolower($itemValue); } return $itemValue == $value; }); });
要使用它,只需调用:
$collection = collect(['name' => 'John'], ['name' => 'Bobby']); // will return John, as 'John' == 'john' $collection->insensitiveFirstWhere('name', 'john');
vyswwuz24#
class AppServiceProvider extends ServiceProvider { public function boot() { Collection::macro('locate', function (string $attribute, string $value) { return $this->filter(function ($item) use ($attribute, $value) { return strtolower($item[$attribute]) == strtolower($value); }); }); } }
像这样使用它:
$collect->locate("sku", "KFALTJK2321")->first()
4条答案
按热度按时间vzgqcmou1#
您可以改为使用
filter()
方法和回调函数来完成您想要的任务:1zmg4dgp2#
可以Map集合并将每个项的属性小写:
vom3gejh3#
我创建了一个集合宏,用于执行不区分大小写的搜索。
下面的版本将获取集合中第一个匹配大小写不敏感项的项。
将此添加到您的服务提供商:
要使用它,只需调用:
vyswwuz24#
像这样使用它: