web-dev-qa-db-fra.com

PHP Syntaxe de propagation dans une déclaration de tableau

PHP supporte la syntaxe de propagation pour fonctions variadiques .

En JavaScript, vous pouvez utiliser la syntaxe spread pour faire this :

var a = [1, 2];
var b = [...a, 3, 4];
console.log(b); // [1, 2, 3, 4]

Cependant, essayez de faire cela en PHP:

$a = [1, 2];
$b = [...$a, 3, 4];
var_dump($b);die;

Résultats dans cette erreur:

Erreur d'analyse: erreur de syntaxe, '...' inattendu (T_Ellipsis), en attente de ']'

L'utilisation de la syntaxe spread de cette manière n'est-elle pas autorisée en PHP? Si oui, existe-t-il un moyen tout aussi élégant d’atteindre le même effet?

21
Nathan Arthur

L'opérateur de propagation dans les tableaux RFC a été implémenté dans PHP 7.4:

$ary = [3, 4, 5];
return [1, 2, ...$ary]; // same as [1, 2, 3, 4, 5]

Mise en garde: Le tableau non compressé/Traversable ne peut contenir que des clés entières. Pour les clés de chaîne, array_merge() est toujours requis.

12
Erald Karakashi

Mise à jour: Opérateur Spread dans une expression de tableau

Source : https://wiki.php.net/rfc/spread_operator_for_array

Version: 0.2
Date: 2018-10-13
Author: CHU Zhaowei, [email protected]
Status: Implemented (in PHP 7.4)

Une paire de tableaux préfixée par sera développé par endroits lors de la définition du tableau. Seuls les tableaux et les objets implémentant Traversable peuvent être développés.

Par exemple:

$parts = ['Apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'Apple', 'pear', 'watermelon'];

Il est possible d'effectuer l'extension plusieurs fois et, contrairement au décompression d'arguments,… peut être utilisé n'importe où. Il est possible d'ajouter des éléments normaux avant ou après l'opérateur de propagation.

L'opérateur Spread fonctionne à la fois pour la syntaxe de tableau (array ()) et la syntaxe courte ([]).

Il est également possible de décompresser un tableau retourné par une fonction immédiatement.

$arr1 = [1, 2, 3];
$arr2 = [...$arr1]; //[1, 2, 3]
$arr3 = [0, ...$arr1]; //[0, 1, 2, 3]
$arr4 = array(...$arr1, ...$arr2, 111); //[1, 2, 3, 1, 2, 3, 111]
$arr5 = [...$arr1, ...$arr1]; //[1, 2, 3, 1, 2, 3]

function getArr() {
  return ['a', 'b'];
}
$arr6 = [...getArr(), 'c']; //['a', 'b', 'c']

$arr7 = [...new ArrayIterator(['a', 'b', 'c'])]; //['a', 'b', 'c']

function arrGen() {
    for($i = 11; $i < 15; $i++) {
        yield $i;
    }
}
$arr8 = [...arrGen()]; //[11, 12, 13, 14]

<--------------- Fin de la mise à jour -------------------->

Tout d’abord, vous faites référence à la fonction Variadic avec des tableaux mal interprétés.

Vous pouvez créer votre propre méthode pour cela ou vous pouvez mieux utiliser array_merge comme suggéré par @Mark Baker dans le commentaire de votre question.

Si vous voulez toujours utiliser spread operator/..., vous pouvez implémenter quelque chose comme ça vous-même.

<?php
function merge($a, ...$b) {
    return array_merge($a,$b);
}

$a = [1, 2];
$b = [3,4];
print_r( merge($a, ...$b));
?>

Mais pour moi, le faire comme ceci est une stupidité. Parce que vous devez toujours utiliser quelque chose comme array_merge. Même si un langage l'implémente, derrière la scène, le langage utilise la fonction de fusion qui contient du code permettant de copier tous les éléments de deux tableaux dans un seul tableau. J'ai écrit cette réponse simplement parce que vous aviez demandé comment procéder, et l'élégance était votre exigence.

Exemple plus raisonnable:

<?php
$a = [1,2,3,56,564];
$result = merge($a, 332, 232, 5434, 65);
var_dump($result);
?>
10
Ravinder Payal

Dans PHP 7.4), vous pouvez maintenant utiliser des opérateurs de propagation dans des expressions de tableau.

$parts = ['Apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'Apple', 'pear', 'watermelon'];
5
Mwthreex