在Laravel 4中以eloquent列表的形式访问对象数组

时间:2016-08-25 10:00:27

标签: php arrays laravel eloquent array-filter

我有一个返回列表的Laravel查询。我需要过滤此列表并在过滤后选择一个随机项。

$places = getPlaces();
if ( count($places) > 0) {           
    $places = array_filter($places, "filter"); // 2016/08/25: see http://php.net/manual/en/function.array-filter.php

    $randomPlace = $places[rand(0, count($places) - 1)];
}

这会出错:

array_filter() expects parameter 1 to be array, object give

如果我将$places转换为数组错误,但我什么都没得到:

$places = getPlaces();
if ( count($places) > 0) {
    $places = (array)$places;      
    $places = array_filter($places, "filter");

    $randomPlace = $places[rand(0, count($places) - 1)];
}

当我检查count($places)时,我发现只有一个项目。结果集有几个。

为了解决过滤器问题,我使用了Eloquent' toArray()

if ( count($places) > 0) {

    $places = $places->toArray();

    $places = array_filter($places, "filter");

    if ( count($places) > 0) {
        $randomPlace = $places[rand(0, count($places) - 1)];
    }

}

这适用于filter,但我遇到了几个挑战:

  1. 我无法将$ randomPlace作为对象访问,例如$ randomPlace->名称。我必须使用数组访问,$ randomPlace [' name']。由于还有其他期望对象的方法,这意味着必须更改/转换所有这些方法。

  2. $ places [rand(0,count($ places) - 1)]给出错误,例如:

    Undefined offset: 4

  3. 除了必须更改所有方法以使用arrays而不是objects(从而失去功能)之外,目前唯一的另一种方法是创建一个迭代的函数$ places和将对象放入数组中。

    有没有更好的方法来解决这个问题?

    感谢。

1 个答案:

答案 0 :(得分:2)

您似乎正在使用某个集合,并在将其转换为可以使用array_filter的数组时绊倒。相反,使用内置的集合方法来过滤和检索随机元素:

$randomItem = $places->filter('filter')->random();

在上面的示例中,filter()方法的参数是过滤函数的名称。我建议将其称为filter之外的其他内容,以提高可读性。 :)