【问题标题】:sortBy returns object instead of arraysortBy 返回对象而不是数组
【发布时间】:2020-04-11 12:45:15
【问题描述】:

我有这个代码

            $list = Elements::where('list_id', $id)->with('visitors')->get()->sortBy(function($t)
{
            return $t->visitors->count();
        });
        return json_encode($list);

此代码返回对象,而不是数组。怎么改?

【问题讨论】:

    标签: php arrays json laravel


    【解决方案1】:

    你只需要调用->all()Collection方法,所以

    $list = Elements::where('list_id', $id)->with('visitors')->get()->sortBy(function($t)
          {
                 return $t->visitors->count();
          }
    )->all();
    

    这与->toArray() 方法不同,因为它还会将集合内的对象也转换为数组,而不仅仅是集合本身(实际上->all() 不会转换任何内容,它只会返回内部的元素收藏)

    【讨论】:

      【解决方案2】:
      $list = Elements::where('list_id', $id)->with('visitors')->get();;
      

      此代码返回集合实例。 $collection->sortBy(...); 也是 Collection 实例。要在 Collection 中获取数组,您必须使用 ->toArray()->all()

      在你的情况下,你可以使用

      $list = Elements::where('list_id', $id)->with('visitors')->get()->sortBy(function($t) {
          return $t->visitors->count();
      })->toArray();
      

      【讨论】:

        【解决方案3】:

        如果你最后想要一个实际的 JSON 数组,你应该添加 ->values()

        由于您可能会添加其他操作,例如过滤器和转换,我会在最后一刻致电 ->values()

        return json_encode($list->values());
        

        使用->values() 而不是其他选项的原因是它重置了数组键。如果你尝试返回一些关联数组(比如['name' => 'Roman'] 甚至[1 => 'item', 0 => 'other']),它总是会被编码为一个对象。您需要有一个普通数组(顺序整数键从 0 开始)以避免过滤和排序会做的意外事情。

        【讨论】:

          猜你喜欢
          • 2018-07-05
          • 1970-01-01
          • 1970-01-01
          • 2020-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多