2017-10-21 3 views
1

Utilisation de Laravel version 5.4.Pourquoi la collection laravel cartographie-t-elle différemment les éléments du tableau?

code:

collect(['3a', '4b'])->map('intval')->all(); 

Résultat attendu: [3, 4]

Mais au lieu de la ligne au-dessus des rendements [3, 0] - à savoir le premier élément est transformé correctement, alors que le second n'est pas?

Que se passe-t-il ici?

Noteworthy, je reçois le résultat correct avec la fonction native php array_map:

// returns [3, 4] 
array_map('intval', ['3a', '4b']); 

Répondre

1

Afin de comprendre exactement ce qui se passe, nous pouvons vérifier le code source de la classe de collection où l'on trouve la fonction de carte

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

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

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

Donc, quelle laravel ajoute-t-il réellement les clés à l'appel de la fonction array_map, qui produit finalement cet appel array_map('intval', ['3a', '4b'], [0, 1])

Cela appellera respectivement intval('3a', 0) et intval('4b', 1), ce qui, comme prévu, donnera 3 et 0, car le deuxième paramètre d'intval selon le official PHP docs est en fait la base.

Laravel ajoute les clés parce que parfois, vous pouvez les utiliser dans votre rappel de carte en tant que telle

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

bien, cela a du sens. Merci pour l'explication! J'étais sur le point de poster un bug sur le tracker officiel. –

1

si vous essayez d'après la carte de collection Laravel syntaxe, il donne le résultat attendu

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

Résultat

[3,4] 
1

Juste testé, cela arrive, parce que map() passe clés es de collection comme troisième argument:

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

Alors:

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