在Laravel中将数组转换为集合

use*_*908 15 collections laravel laravel-5

我在PHP中有以下数组:

[
  {
     "website": "example",
     "url": "example.com"
  },
  {
     "website": "example",
     "url": "example.com"
  }
]
Run Code Online (Sandbox Code Playgroud)

现在我想把它转换成一个集合,所以我按键website或者排序url.但是当我这样做时:

$myArray = collect(websites);
Run Code Online (Sandbox Code Playgroud)

我得到了这个:

 {
      "0": {
         "website": "example",
         "url": "example.com"
      },
      "1": {
         "website": "example",
         "url": "example.com"
      }
    }
Run Code Online (Sandbox Code Playgroud)

并且排序不起作用,我想知道我做错了什么以及如何修复它所以我有一个我可以轻松排序的对象的数组集合.

编辑: 我希望输出与此相同:

[
  {
     "website": "example",
     "url": "example.com"
  },
  {
     "website": "example",
     "url": "example.com"
  }
]
Run Code Online (Sandbox Code Playgroud)

通过"排序不起作用"我的意思是项目没有排序.

Jon*_*han 30

如果你有

$collection = collect([
    (object) [
        'website' => 'twitter',
        'url' => 'twitter.com'
    ],
    (object) [
        'website' => 'google',
        'url' => 'google.com'
    ]
]);
Run Code Online (Sandbox Code Playgroud)

然后,将您的数组包装在Collection类的实例中.这意味着它不会像典型的数组一样( - 它会像数组一样,但不要像对待它一样 - ),直到你调用它all()toArray()它为止.要删除您需要使用的任何添加的索引values().

$sorted = $collection->sortBy('website');

$sorted->values()->all();
Run Code Online (Sandbox Code Playgroud)

预期产量:

[
     {#769
       +"website": "google",
       +"url": "google.com",
     },
     {#762
       +"website": "twitter",
       +"url": "twitter.com",
     },
]
Run Code Online (Sandbox Code Playgroud)

请参阅文档https://laravel.com/docs/5.1/collections#available-methods

toArray方法将集合转换为普通的PHP数组.如果集合的值是Eloquent模型,则模型也将转换为数组.

all方法返回集合表示的基础数组.

  • 简短答案:使用`collect($ arr)`。 (8认同)
  • 正是我想要的!谢谢,我了解它现在是如何工作的,当我测试它时它起作用了.:) (2认同)
  • 简短的回答扩展:有不同的集合。1.collect(array $array) 或 2.new \Illuminate\Database\Eloquent\Collection(array $array)。首先从 Illuminate\Database\Eloquent\Collection 类型返回集合。然而,在某些情况下,您需要 Eloquent 数据库集合,然后选择第二个。 (2认同)

Abd*_*sit 8

在我的情况下,我正在制作一个集合来伪造服务以用于测试目的,所以我使用

$collection = new Collection();
    foreach($items as $item){
                $collection->push((object)['prod_id' => '99',
                                           'desc'=>'xyz',
                                           'price'=>'99',
                                           'discount'=>'7.35',

                ]);

            }
Run Code Online (Sandbox Code Playgroud)