Welcome! Log In Create A New Profile

Advanced

[PHP-DEV] Array decomposition, more than list()

Posted by Clint Priest 
Clint Priest
[PHP-DEV] Array decomposition, more than list()
May 13, 2012 06:50PM
I've been using array decomposition in other languages such as Javascript recently and find it very useful. I did not find any conversation about it in the archives, has this topic been discussed/vetted/shot down already?

Example use case: Indexed database results being iterated:

Input:
$tValues[$dbRow['ID1']][$dbRow['ID2']][$dbRow['ID3']] = $dbRow['Value'];

Output:
foreach($tValues as $ID1 => $tSubValues1) {
foreach($tSubValues1 as $ID2 => $tSubValues2) {
foreach($tSubValues2 as $ID3 => $Value) {
/* Do something, such as build an SQL insert */
}
}
}

The above is a semi-common piece of code in our production application, I could see list decomposition as a very convenient alternative.

New functionality would support:

foreach($tValues as $ID1 => [$ID2 => [$ID3 => $Value] ]) {
/* Do something */
}

The above also would indicate that associative array key decomposition would also be allowed. I don't believe anything like the above is possible, even outside of a foreach loop, but perhaps I am wrong there.

What do you think?

-Clint
Ivan Enderlin @ Hoa
Re: [PHP-DEV] Array decomposition, more than list()
May 13, 2012 07:20PM
Hi Clint,

On 13/05/12 18:41, Clint Priest wrote:
> I've been using array decomposition in other languages such as Javascript recently and find it very useful. I did not find any conversation about it in the archives, has this topic been discussed/vetted/shot down already?
>
> Example use case: Indexed database results being iterated:
>
> Input:
> $tValues[$dbRow['ID1']][$dbRow['ID2']][$dbRow['ID3']] = $dbRow['Value'];
>
> Output:
> foreach($tValues as $ID1 => $tSubValues1) {
> foreach($tSubValues1 as $ID2 => $tSubValues2) {
> foreach($tSubValues2 as $ID3 => $Value) {
> /* Do something, such as build an SQL insert */
> }
> }
> }
>
> The above is a semi-common piece of code in our production application, I could see list decomposition as a very convenient alternative.
>
> New functionality would support:
>
> foreach($tValues as $ID1 => [$ID2 => [$ID3 => $Value] ]) {
> /* Do something */
> }
>
> The above also would indicate that associative array key decomposition would also be allowed. I don't believe anything like the above is possible, even outside of a foreach loop, but perhaps I am wrong there.
The semantics of list() and foreach are different. A list() extracts
data in variables, whereas a foreach is a loop that iterates over a
structured data. Of course, I assume you know that. But what is the
semantics you give to foreach($array as $key1 => [$key2 => [$key3 =>
$value]])? Are you interating on $key1, then $key2, then $key3, or just
unfolding/extracting these variables? In other terms, what happened when
$key1 has more than 1 value? Do we iterate or extract? It is not clear here.
Could you point out some references (e.g. from Javascript)?

Best regards.

--
Ivan Enderlin
Developer of Hoa
http://hoa.42/ or http://hoa-project.net/

PhD. student at DISC/Femto-ST (Vesontio) and INRIA (Cassis)
http://disc.univ-fcomte.fr/ and http://www.inria.fr/

Member of HTML and WebApps Working Group of W3C
http://w3.org/




--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
Clint Priest
RE: [PHP-DEV] Array decomposition, more than list()
May 14, 2012 12:40AM
In the below example, it would deconstruct as such:



$tValues = array(

'ID1-1' => array(

'ID2-1' => array(

'ID3-1' => 'Value1',

'ID3-2' => 'Value2',

),

'ID2-2' => array(

'ID3-3' => 'Value3',

'ID3-4' => 'Value4',

),

),

);



Given this foreach line:

foreach($tValues as $ID1 => [$ID2 => [$ID3 => $Value] ]) {

/* Do something */

}



I would expect the log to be as:

First Loop:

$tValues is iterated, assigning ID1-1 to $ID1 and array(

'ID2-1' => array(

'ID3-1' => 'Value1',

'ID3-2' => 'Value2',

),

'ID2-2' => array(

'ID3-3' => 'Value3',

'ID3-4' => 'Value4',

),

), to the first decomposition



Which would decompose the $ID2 and its first value, etc.



I see what you mean by your comments, it would need to intelligently iterate through the lowest element arrays first on up.



The above example, if iterated through, each loop I would expect to have these values:

Iteration ID1 ID2 ID3 Value

------------------------------------------------

0 ID1-1 ID2-1 ID3-1 Value1

1 ID1-1 ID2-1 ID3-2 Value2

2 ID1-1 ID2-2 ID3-3 Value3

3 ID1-1 ID2-2 ID3-4 Value4





I was referring to the Array destructuring section of this document:

https://developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.7#Array_comprehensions



Though a great many of the other discussions on that page would be really incredible for PHP as well.



I see on that document it does not talk about a complex destructuring such as I've described above.



My email here was to find if this would garner any interest from the PHP community.





> -----Original Message-----

> From: Ivan Enderlin @ Hoa [mailto:[email protected]]

> Sent: Sunday, May 13, 2012 12:11 PM

> To: internals@lists.php.net

> Subject: Re: [PHP-DEV] Array decomposition, more than list()

>

> Hi Clint,

>

> On 13/05/12 18:41, Clint Priest wrote:

> > I've been using array decomposition in other languages such as Javascript recently and find it very useful. I did not find any

> conversation about it in the archives, has this topic been discussed/vetted/shot down already?

> >

> > Example use case: Indexed database results being iterated:

> >

> > Input:

> > $tValues[$dbRow['ID1']][$dbRow['ID2']][$dbRow['ID3']] =

> > $dbRow['Value'];

> >

> > Output:

> > foreach($tValues as $ID1 => $tSubValues1) {

> > foreach($tSubValues1 as $ID2 => $tSubValues2) {

> > foreach($tSubValues2 as $ID3 => $Value) {

> > /* Do something, such as build an SQL insert */

> > }

> > }

> > }

> >

> > The above is a semi-common piece of code in our production application, I could see list decomposition as a very convenient

> alternative.

> >

> > New functionality would support:

> >

> > foreach($tValues as $ID1 => [$ID2 => [$ID3 => $Value] ]) {

> > /* Do something */

> > }

> >

> > The above also would indicate that associative array key decomposition would also be allowed. I don't believe anything like the

> above is possible, even outside of a foreach loop, but perhaps I am wrong there.

> The semantics of list() and foreach are different. A list() extracts data in variables, whereas a foreach is a loop that iterates over a

> structured data. Of course, I assume you know that. But what is the semantics you give to foreach($array as $key1 => [$key2 =>

> [$key3 => $value]])? Are you interating on $key1, then $key2, then $key3, or just unfolding/extracting these variables? In other

> terms, what happened when

> $key1 has more than 1 value? Do we iterate or extract? It is not clear here.

> Could you point out some references (e.g. from Javascript)?

>

> Best regards.

>

> --

> Ivan Enderlin

> Developer of Hoa

> http://hoa.42/ or http://hoa-project.net/

>

> PhD. student at DISC/Femto-ST (Vesontio) and INRIA (Cassis) http://disc.univ-fcomte.fr/ and http://www.inria.fr/

>

> Member of HTML and WebApps Working Group of W3C http://w3.org/

>

>

>

>

> --

> PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Sorry, only registered users may post in this forum.

Click here to login