rfc:iterator_xyz_accept_array

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
rfc:iterator_xyz_accept_array [2022/06/21 14:14] timwollarfc:iterator_xyz_accept_array [2022/07/19 14:45] – Accepted timwolla
Line 3: Line 3:
   * Date: 2022-06-21   * Date: 2022-06-21
   * Author: Tim Düsterhus, duesterhus@woltlab.com   * Author: Tim Düsterhus, duesterhus@woltlab.com
-  * Status: Draft+  * Status: Accepted
   * First Published at: http://wiki.php.net/rfc/iterator_xyz_accept_array   * First Published at: http://wiki.php.net/rfc/iterator_xyz_accept_array
  
Line 9: Line 9:
 ===== Introduction ===== ===== Introduction =====
  
-PHP's iterator_*() family currently only accept <php>\Traversable</php>s (i.e. they reject plain <php>array</php>s). This is unnecessarily limiting.+PHP'<php>iterator_*()</php> family currently only accept <php>\Traversable</php>s (i.e. they reject plain <php>array</php>s). This is unnecessarily limiting.
  
-Specifically this concerns the <php>iterator_to_array()</php><php>iterator_count()</php>, and <php>iterator_apply()</php> function. While each of them has an array-specific counterpart, the fact that one needs to choose either the array-specific variant or the everything-but-array variant makes writing code the deals with arbitrary <php>iterable</php>s unnecessarily verbose.+Specifically this concerns the <php>iterator_to_array()</php> and <php>iterator_count()</php> functions. While each of them has an array-specific counterpart, the fact that one needs to choose either the array-specific variant or the everything-but-array variant makes writing code the deals with arbitrary <php>iterable</php>s unnecessarily verbose.
  
-Specifically allowing <php>iterator_to_array()</php> to take an array, makes it much easier to write functions accepting an <php>iterable</php> and processing it using <php>array_map()</php> et al:+As an example: Allowing <php>iterator_to_array()</php> to take an array, makes it much easier to write functions accepting an <php>iterable</php> and processing it using <php>array_map()</php> et al:
  
 <PHP> <PHP>
Line 32: Line 32:
 ===== Proposal ===== ===== Proposal =====
  
-The <php>$iterator</php> parameter of <php>iterator_to_array()</php><php>iterator_count()</php>, and <php>iterator_apply()</php> should be widened from <php>\Traversable</php> to <php>iterable</php> (i.e. to <php>\Traversable|array</php>).+The <php>$iterator</php> parameter of <php>iterator_to_array()</php> and <php>iterator_count()</php> should be widened from <php>\Traversable</php> to <php>iterable</php> (i.e. to <php>\Traversable|array</php>)
 + 
 +Specifically if this RFC is accepted the following shall hold: 
 + 
 +==== iterator_to_array ==== 
 + 
 +<PHP> 
 +iterator_to_array($array, true) == $array 
 +iterator_to_array($array, false) == array_values($array) 
 +</PHP> 
 + 
 +==== iterator_count ==== 
 + 
 +<PHP> 
 +iterator_count($array) == count($array) 
 +</PHP> 
 + 
 +==== iterator_apply ==== 
 + 
 +This function is **not** part of this proposal, because it is non-obvious how to define the behavior for <php>array</php>s, given that it does not pass the <php>Iterator</php> to the callback by default.
  
 ===== Backward Incompatible Changes ===== ===== Backward Incompatible Changes =====
Line 70: Line 89:
 ===== Unaffected PHP Functionality ===== ===== Unaffected PHP Functionality =====
  
-Anything that isn't <php>iterator_to_array()</php><php>iterator_count()</php>, or <php>iterator_apply()</php>.+Anything that isn't <php>iterator_to_array()</php> or <php>iterator_count()</php>.
  
 ===== Future Scope ===== ===== Future Scope =====
Line 78: Line 97:
 ===== Proposed Voting Choices ===== ===== Proposed Voting Choices =====
  
-Each vote requires a 2/3 majority..+Each vote requires a 2/3 majority. 
 + 
 +Voting opened 2022-07-05 14:30 UTC and closes on 2022-07-19 14:45 UTC. 
 + 
 +<doodle title="iterator_to_array: Change the type of iterator_to_array()’s $iterator parameter from \Traversable to iterable?" auth="timwolla" voteType="single" closed="true"> 
 +   * Yes 
 +   * No 
 +</doodle> 
 + 
  
-  * Vote 1: Change the type of <php>iterator_to_array()</php>'s <php>$iterator</php> parameter from <php>\Traversable</php> to <php>iterable</php>? +<doodle title="iterator_count: Change the type of iterator_count()s $iterator parameter from \Traversable to iterable?" auth="timwolla" voteType="single" closed="true"
-  * Vote 2: Change the type of <php>iterator_count()</php>'<php>$iterator</php> parameter from <php>\Traversable</php> to <php>iterable</php>? +   Yes 
-  Vote 3: Change the type of <php>iterator_apply()</php>'s <php>$iterator</php> parameter from <php>\Traversable</php> to <php>iterable</php>?+   * No 
 +</doodle>
  
 ===== Patches and Tests ===== ===== Patches and Tests =====
  
-PoC implementation to <php>iterator_to_array</php>: https://github.com/php/php-src/pull/8819+https://github.com/php/php-src/pull/8819
  
 ===== Implementation ===== ===== Implementation =====
rfc/iterator_xyz_accept_array.txt · Last modified: 2022/07/19 14:47 by timwolla