使用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]
答案 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) { ... });