Re: iterating and changing value of an array using foreach and references - PHP 5.2.3
| From: | Sean Pringle | Date: | Sun, 19 Aug 2007 21:10:00 +0000 |
| Subject: | Re: iterating and changing value of an array using foreach and references - PHP 5.2.3 | ||
| References: | 1 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-261026@lists.php.net to get a copy of this message | ||
On 8/18/07, Yashesh Bhatia <yasheshb@gmail.com> wrote:
> Hi,
>
> Here's an interesting observation i noticed while using foreach to
> iterate on arrays using
> references for it's values.
>
>
>
> -----------------------------------------------------------------------------------------------------------------
> PHP version
> $ php -v
> PHP 5.2.3 (cli) (built: Jun 8 2007 14:31:21)
> Copyright (c) 1997-2007 The PHP Group
> Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
>
> -----------------------------------------------------------------------------------------------------------------
> Source code
> <?php
>
> // initialize array
> $cat1 = array();
> $cat1[15] = array('tid' => 15, 'ar_needed' => 'no');
> $cat1[16] = array('tid' => 16, 'ar_needed' => 'no');
> $cat1[17] = array('tid' => 17, 'ar_needed' => 'no');
>
> // print it
> print "\n\$cat1 = ";
> print_r($cat1);
> print "\n";
>
> // iterate using foreach and reference
> foreach ($cat1 as $k => &$v) {
> if ($k == 15) {
> $v['ar_needed'] = 'yes'; // dummy change
> }
> }
>
> // print array
> print "\n\$cat1 = ";
> print_r($cat1);
> print "\n";
At this point, $v is still a reference to $cat1[17]. Try:
unset($v);
> // reiterate
> foreach ($cat1 as $k => $v) {
> print "\$k = $k\n";
> print "\$v = ";
> print_r($v);
> print "\n";
> }
> ?>
>
> -----------------------------------------------------------------------------------------------------------------
> OUTPUT
> $cat1 = Array
> (
> [15] => Array
> (
> [tid] => 15
> [ar_needed] => no
> )
> [16] => Array
> (
> [tid] => 16
> [ar_needed] => no
> )
> [17] => Array
> (
> [tid] => 17
> [ar_needed] => no
> )
> )
>
> $cat1 = Array
> (
> [15] => Array
> (
> [tid] => 15
> [ar_needed] => yes
> )
> [16] => Array
> (
> [tid] => 16
> [ar_needed] => no
> )
> [17] => Array
> (
> [tid] => 17
> [ar_needed] => no
> )
> )
>
> $k = 15
> $v = Array
> (
> [tid] => 15
> [ar_needed] => yes
> )
>
> $k = 16
> $v = Array
> (
> [tid] => 16
> [ar_needed] => no
> )
>
> $k = 17
> $v = Array
> (
> [tid] => 16
> [ar_needed] => no
> )
>
> -----------------------------------------------------------------------------------------------------------------
>
> As seen in the above output all the print statements give expected
> output except the last
> set in the 2nd iteration
> $k = 17
> $v = Array
> (
> [tid] => 16
> [ar_needed] => no
> )
>
> the $k looks fine but the $v is not correct for some reason. Any clue
> what could be wrong
> here ?. Also, in the 2nd iteration of the name of the variable is
> changed from $v to $v1
> it displays correctly
> $k = 17
> $v1 = Array
> (
> [tid] => 17
> [ar_needed] => no
> )
After the first loop, $v is still a reference to $cat1[17]. Each time
around the last loop, assigning again to $v will overwrite $cat1[17].