rfc:spread_operator_for_array
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
rfc:spread_operator_for_array [2018/11/19 08:21] – jhdxr | rfc:spread_operator_for_array [2019/04/05 14:10] – more example jhdxr | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Spread Operator in Array Expression ====== | ====== Spread Operator in Array Expression ====== | ||
- | * Version: 0.1 | + | * Version: 0.2 |
* Date: 2018-10-13 | * Date: 2018-10-13 | ||
* Author: CHU Zhaowei, jhdxr@php.net | * Author: CHU Zhaowei, jhdxr@php.net | ||
Line 22: | Line 22: | ||
Spread operator works for both array syntax('' | Spread operator works for both array syntax('' | ||
+ | |||
+ | It's also possible to unpack array returned by a function immediately. | ||
+ | |||
<code php> | <code php> | ||
$arr1 = [1, 2, 3]; | $arr1 = [1, 2, 3]; | ||
Line 27: | Line 30: | ||
$arr3 = [0, ...$arr1]; //[0, 1, 2, 3] | $arr3 = [0, ...$arr1]; //[0, 1, 2, 3] | ||
$arr4 = array(...$arr1, | $arr4 = array(...$arr1, | ||
- | </code> | + | $arr5 = [...$arr1, ...$arr1]; |
- | ==== String keys ==== | + | function getArr() { |
+ | return [' | ||
+ | } | ||
+ | $arr6 = [...getArr(), | ||
- | It's possible to unpack arrays with string keys. When unpacking multiple arrays with same string key, the later value for that key will overwrite the previous one. | + | $arr7 = [...new ArrayIterator([' |
- | For arrays with numeric keys, they will be renumbered with incrementing keys starting from zero. So if unpack multiple arrays with same numeric key, the later value will be appended instead of overwriting the previous one. | + | function arrGen() { |
- | + | for($i = 11; $i < 15; $i++) { | |
- | It's possible to unpack arrays with mixed string and numeric keys. | + | yield $i; |
- | <code php> | + | } |
- | $arr1 = [' | + | |
- | $arr2 = [11 => 11, 22 => 22, 33 => 33]; | + | |
- | $arr3 = [111 => 9, 22 => 8, ' | + | |
- | var_dump([...$arr1, ...$arr2]); | + | |
- | /* | + | |
- | array(6) { | + | |
- | | + | |
- | | + | |
- | [" | + | |
- | int(2) | + | |
- | [" | + | |
- | int(3) | + | |
- | [0]=> | + | |
- | int(11) | + | |
- | [1]=> | + | |
- | int(22) | + | |
- | [2]=> | + | |
- | int(33) | + | |
} | } | ||
- | */ | + | $arr8 = [...arrGen()]; //[11, 12, 13, 14] |
- | var_dump([...$arr1, ...$arr3]); | + | |
- | /* | + | |
- | array(5) { | + | |
- | [" | + | |
- | int(1) | + | |
- | [" | + | |
- | int(2) | + | |
- | [" | + | |
- | int(7) | + | |
- | [0]=> | + | |
- | int(9) | + | |
- | [1]=> | + | |
- | int(8) | + | |
- | } | + | |
- | */ | + | |
- | var_dump([...$arr2, | + | |
- | /* | + | |
- | array(6) { | + | |
- | | + | |
- | int(11) | + | |
- | [1]=> | + | |
- | int(22) | + | |
- | [2]=> | + | |
- | int(33) | + | |
- | [3]=> | + | |
- | int(9) | + | |
- | [4]=> | + | |
- | int(8) | + | |
- | [" | + | |
- | int(7) | + | |
- | } | + | |
- | */ | + | |
</ | </ | ||
- | Actually there are several ways to handle string keys in PHP now: | ||
- | 1. keep string keys | ||
- | 2. discard string keys, append the values only | ||
- | 3. raise warning / error for string keys | ||
- | This RFC adopts option 1 for the following reasons. Since the spread operator here is an extension for array defination,and the array defination syntax allows array with string keys, option 3 has been ruled out. Prior to this RFC, '' | + | ==== String keys ==== |
+ | |||
+ | In order to make the behavior consistent | ||
==== By-reference passing ==== | ==== By-reference passing ==== | ||
Line 102: | Line 56: | ||
<code php> | <code php> | ||
$arr1 = [1, 2, 3]; | $arr1 = [1, 2, 3]; | ||
- | $arr2 = [...& | + | $arr2 = [...& |
</ | </ | ||
Line 125: | Line 79: | ||
</ | </ | ||
+ | ===== Backward Incompatible Changes ===== | ||
+ | This change should not break anything. | ||
+ | ===== Q & A ===== | ||
+ | ==== Advantages over array_merge ==== | ||
+ | - Spread operator should have a better performance than '' | ||
+ | - '' | ||
+ | <code php> | ||
+ | // Before | ||
+ | array_merge(iterator_to_array($iter1), | ||
- | ===== Backward Incompatible Changes ===== | + | // Or to generalise to all iterables |
- | This change | + | array_merge( is_array($iter1) ? $iter1 : iterator_to_array($iter1), |
+ | is_array($iter2) ? $iter2 : iterator_to_array($iter2) ) | ||
+ | |||
+ | // After (handles both cases) | ||
+ | [ ...$iter1, ...$iter2 ] | ||
+ | |||
+ | //Thanks Rowan for providing this example | ||
+ | </ | ||
+ | |||
+ | ==== ... should be preserved for other use (e.g. map concat) | ||
+ | This is kind of out of scope here to discuss other concat / merge operation. The important thing is we should | ||
===== Proposed PHP Version(s) ===== | ===== Proposed PHP Version(s) ===== |
rfc/spread_operator_for_array.txt · Last modified: 2019/05/13 12:45 by nikic