【问题标题】:Laravel Collections: Shift Value *and* Key?Laravel 集合:移位值*和*键?
【发布时间】:2018-01-15 03:49:51
【问题描述】:

laravel 集合方法(或 PHP 数组方法,就此而言)是否有办法转移集合的第一个键/值对?

也就是说,如果我有下面这个小程序

$collection = collect(['key1'=>'value1','key2'=>'value2']);        

var_dump(
    $collection->first()
);

var_dump(
    $collection->shift()
);

我可以shift() value1 关闭集合的开头,或者通过first() 抓住它而不删除它。我想要的是,通过一行代码,转移或抓住第一个值的 key(即key1)。我知道我可以做这样的事情

$result = (function($c){
    foreach($c as $key=>$value)
    {
        return $key;
    }
})($collection);

但我希望/想知道 Laravel 是否有更优雅/更紧凑的东西。

【问题讨论】:

  • 你根本不关心价值观吗?
  • @Devon 我有些关心它们——但是如果没有办法用它们的键来获取两个值,只需一行额外的代码。

标签: php laravel collections


【解决方案1】:

获取钥匙的一种方法是使用

$collectionOfKeys = $collection->keys();

要获得第一个密钥,您可以这样做:

$key = $collection->keys()->first();

但是,由于 keys() 将返回一个新集合,因此无法在一行中将原始集合中的值移出,但您可以使用 $key 的忘记或在之后移动原始集合。

$collection->forget($key);
// or $collection->shift();

【讨论】:

  • 我也会这样做。它干净、不言自明,并使用了专用的 Laravel 方法。
  • @lesssugar 你会因为你需要第一个元素而要求 Laravel 构建一个可能包含数百万个元素的键数组?为什么?
  • 我同意 splice() 是处理这个问题的最有效方法,当 Jean 发布他的答案时,我举了一个例子。这种方式可行,但在大型集合上效率低下。
  • @Axalix 你找到我了。
【解决方案2】:

Splice 可以为您工作:

$collection = collect(['key1'=>'value1','key2'=>'value2']); 

$chunked = $collection->splice(0, 1);

print_r($chunked);
//Array([key1] => value1)

print_r($collection->all());
//Array ( [key2] => value2 )

见:https://laravel.com/docs/5.4/collections#method-splice

【讨论】:

  • 打败我,只是在更新我的答案。
【解决方案3】:

抓取一个元素(拳头或最后一个):

第一个

$collection->take(1);

结果

=> Illuminate\Support\Collection {#926
     all: [
       "key1" => "value1",
     ],
   }

最后一个

$collection->take(-1);

结果

=> Illuminate\Support\Collection {#924
     all: [
       "key2" => "value2",
     ],
   }

抓住第一把钥匙我

$collection->take(1)->keys()->first();

结果

"key1"

抓住第一把钥匙 II

key($collection->take(1)->toArray());

结果

"key1"

【讨论】:

    猜你喜欢
    • 2017-09-27
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 2018-02-12
    • 2022-01-20
    • 1970-01-01
    • 2019-08-11
    相关资源
    最近更新 更多