web-dev-qa-db-ja.com

PHP配列宣言のスプレッド構文

PHPは variadic functions のスプレッド構文をサポートしています。

JavaScriptでは、spread構文を使用して this を実行できます。

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

ただし、PHPでこれを実行しようとすると:

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

このエラーの結果:

解析エラー:構文エラー、予期しない「...」(T_Ellipsis)、「]」が必要

この方法でスプレッド構文を使用するのはPHPでは許可されていませんか?もしそうなら、同じ効果を達成する上品な方法がありますか?

21
Nathan Arthur

配列RFC のスプレッド演算子は、PHP 7.4:

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

警告:パックされていない配列/ Traversableは整数キーのみを持つことができます。文字列キーの場合、array_merge()は引き続き必要です。

12
Erald Karakashi

更新:配列式のスプレッド演算子

ソース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)

で始まる配列のペアは、配列の定義中に場所で展開されます。 Traversableを実装する配列とオブジェクトのみを展開できます。

例えば:

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

拡張を複数回行うことが可能であり、引数の展開とは異なり、...はどこでも使用できます。スプレッド演算子の前後に通常の要素を追加することができます。

スプレッド演算子は、配列構文(array())と短い構文([])の両方で機能します。

関数から返された配列をすぐにアンパックすることもできます。

$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]

<---------------アップデートの終了-------------------->

まず、間違った意味で配列を使用してVariadic関数を参照しています。

これを行うための独自のメソッドを作成するか、質問の下のコメントで@Mark Ba​​kerが提案するarray_mergeをより適切に使用できます。

それでもスプレッド演算子/ ...を使用する場合は、このようなものを自分で実装できます。

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

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

しかし、私にとって、このようにそれを行うことは愚かです。まだarray_mergeのようなものを使用する必要があるためです。言語がこれを実装している場合でも、舞台裏では、2つの配列のすべての要素を単一の配列にコピーするコードを含むマージ関数を使用しています。あなたがこれを行う方法を尋ねたからといって、私はこの答えを書きました、そして、優雅さがあなたの要求でした。

より合理的な例:

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

PHP 7.4では、配列式でスプレッド演算子を使用できるようになりました。

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