为什么laravel集合映射数组元素不同?

时间:2017-10-21 09:06:45

标签: laravel

使用Laravel版本5.4。

代码:

...

var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

   window = UIWindow(frame: UIScreen.main.bounds)

   window?.makeKeyAndVisible()

   window?.rootViewController = MyNavigationController(rootViewController: MyTableViewController())

   return true

}

...

预期结果:collect(['3a', '4b'])->map('intval')->all();

但是上面的行返回[3, 4] - 即第一个元素正确转换,而第二个元素没有转换?

这里发生了什么?

值得注意的是,我使用原生的php array_map函数得到了正确的结果:

[3, 0]

3 个答案:

答案 0 :(得分:1)

如果您根据laravel集合映射语法尝试,则会产生预期结果

collect(['3a', '4b'])->map(function($item){
   return intval($item);
})->all();

结果

[3,4]

答案 1 :(得分:1)

刚刚测试过,发生这种情况,因为map()将集合键作为第三个参数传递:

array_map($callback, $this->items, $keys);

所以:

array_map('intval', ['3a', '4b'], [0, 1]); // Result is [3, 0]
array_map('intval', ['3a', '4b']); // Result is [3, 4]

答案 2 :(得分:1)

为了准确理解发生了什么,我们可以检查我们找到地图功能的Collection类源代码

public function map(callable $callback)
{
    $keys = array_keys($this->items);

    $items = array_map($callback, $this->items, $keys);

    return new static(array_combine($keys, $items));
}

那么laravel究竟是什么呢,它实际上也将这些键添加到array_map函数调用中,最终产生了这个调用array_map('intval', ['3a', '4b'], [0, 1])

这将分别调用intval('3a', 0)intval('4b', 1),正如预期的那样将产生3和0,因为根据official PHP docs的intval的第二个参数实际上是基数。

Laravel添加了键,因为有时您可能会在地图回调中使用它们

$collection->map(function($item, $key) { ... });