[PHP] modifying within foreach

2009-06-23 Thread Andres Gonzalez

In the following example:

foreach ($results as $key = $item)  {

   //bla bla bla -- unset some of the $items

}

I want to modify $results within the foreach. In other words,
during a given pass of this iteration, I want to delete some
of the items based on particular conditions. Then on the next
pass thru the foreach, I want $results to be the newer, modified
array.

This does not seem to work. It appears that the foreach statement
is implemented such that $results is read into memory at the start
so that any modifications I make to it during a given pass, are ignored
on the next pass. Is this true?

If so, is there a way that I can tell the foreach statement to re-read the
array $results?  Or am I just going against the grain here?

-Andres


--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



RE: [PHP] modifying within foreach

2009-06-23 Thread Daevid Vincent
 foreach ($results as $key = $item) 
 {
if ($item == 'foo') unset($results[$key]);
 }

 -Original Message-
 From: Andres Gonzalez [mailto:and...@packetstorm.com] 
 Sent: Tuesday, June 23, 2009 11:27 AM
 To: php-general@lists.php.net
 Subject: [PHP] modifying within foreach
 
 In the following example:
 
 foreach ($results as $key = $item)  {
 
 //bla bla bla -- unset some of the $items
 
 }
 
 I want to modify $results within the foreach. In other words,
 during a given pass of this iteration, I want to delete some
 of the items based on particular conditions. Then on the next
 pass thru the foreach, I want $results to be the newer, modified
 array.
 
 This does not seem to work. It appears that the foreach statement
 is implemented such that $results is read into memory at the start
 so that any modifications I make to it during a given pass, 
 are ignored
 on the next pass. Is this true?
 
 If so, is there a way that I can tell the foreach statement 
 to re-read the
 array $results?  Or am I just going against the grain here?
 
 -Andres
 
 
 -- 
 PHP General Mailing List (http://www.php.net/)
 To unsubscribe, visit: http://www.php.net/unsub.php
 


-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] modifying within foreach

2009-06-23 Thread Andres Gonzalez

I do not want to delete the whole array, only a particular $item.
given this $results array:

Array
(
[key1] = Array
(
[0] = value1
[1] = value2
[2] = value 3
(
[key2] = Array
(
[0] = value4
[1] = value5
[2] = value6
)
)

It is a value item that I want to delete based on a particular criteria.
In each pass I may delete a value item. However, it seems that each
subsequent pass operates on the original $results array and not
the modified one.

-Andres



Daevid Vincent wrote:
 foreach ($results as $key = $item) 
 {

if ($item == 'foo') unset($results[$key]);
 }

  

-Original Message-
From: Andres Gonzalez [mailto:and...@packetstorm.com] 
Sent: Tuesday, June 23, 2009 11:27 AM

To: php-general@lists.php.net
Subject: [PHP] modifying within foreach

In the following example:

foreach ($results as $key = $item)  {

//bla bla bla -- unset some of the $items

}

I want to modify $results within the foreach. In other words,
during a given pass of this iteration, I want to delete some
of the items based on particular conditions. Then on the next
pass thru the foreach, I want $results to be the newer, modified
array.

This does not seem to work. It appears that the foreach statement
is implemented such that $results is read into memory at the start
so that any modifications I make to it during a given pass, 
are ignored

on the next pass. Is this true?

If so, is there a way that I can tell the foreach statement 
to re-read the

array $results?  Or am I just going against the grain here?

-Andres


--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php





  


--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] modifying within foreach

2009-06-23 Thread Kirk . Johnson
Andres Gonzalez and...@packetstorm.com wrote on 06/23/2009 12:26:38 PM:

 I want to modify $results within the foreach. In other words,
 during a given pass of this iteration, I want to delete some
 of the items based on particular conditions. Then on the next
 pass thru the foreach, I want $results to be the newer, modified
 array.
 
 This does not seem to work. It appears that the foreach statement
 is implemented such that $results is read into memory at the start
 so that any modifications I make to it during a given pass, are ignored
 on the next pass. Is this true?

foreach works on a copy of an array, so the behavior you saw is expected. 
See the online manual.

You could use a while loop, or, instead of unset-ing elements of $results, 
store the elements you want to keep into a new array.

Kirk


Re: [PHP] modifying within foreach

2009-06-23 Thread Ashley Sheridan
On Tue, 2009-06-23 at 12:56 -0600, kirk.john...@zootweb.com wrote:
 Andres Gonzalez and...@packetstorm.com wrote on 06/23/2009 12:26:38 PM:
 
  I want to modify $results within the foreach. In other words,
  during a given pass of this iteration, I want to delete some
  of the items based on particular conditions. Then on the next
  pass thru the foreach, I want $results to be the newer, modified
  array.
  
  This does not seem to work. It appears that the foreach statement
  is implemented such that $results is read into memory at the start
  so that any modifications I make to it during a given pass, are ignored
  on the next pass. Is this true?
 
 foreach works on a copy of an array, so the behavior you saw is expected. 
 See the online manual.
 
 You could use a while loop, or, instead of unset-ing elements of $results, 
 store the elements you want to keep into a new array.
 
 Kirk

What about passing it by reference?

foreach($results as $key = $item)
{
// modify items here
}

Thanks
Ash
www.ashleysheridan.co.uk


-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



RE: [PHP] modifying within foreach

2009-06-23 Thread Daevid Vincent
Dude. Use your common sense and the example I just provided:

 foreach ($results as $key = $item) 
 {
if ($item == 'foo') 
unset($results[$key]);
else ($item == 'bar')
$results[$key] = 'new value';
 } 

so using your example:

 foreach ($results as $key = $item) 
 {
if ($item[0] == 'value1') 
unset($results[$key][0]);
else ($item[0] == 'bar')
$results[$key][0] = 'value4';
 } 

But since you have a multidimensional array, you have to really do two loops
to be useful:

 foreach ($results as $key = $item) 
 {
 foreach ($item as $i = $value) 
 {
if ($value == 'value1')
 unset($results[$key][$i])
  else ($value == 'bar')
 $results[$key][$i] = 'value4';
 }
 }

Or something to that effect, I just wrote that freehand, but you should get
the idea.

http://daevid.com


 -Original Message-
 From: Andres Gonzalez [mailto:and...@packetstorm.com] 
 Sent: Tuesday, June 23, 2009 11:45 AM
 Cc: php-general@lists.php.net
 Subject: Re: [PHP] modifying within foreach
 
 I do not want to delete the whole array, only a particular $item.
 given this $results array:
 
 Array
 (
 [key1] = Array
 (
 [0] = value1
 [1] = value2
 [2] = value3
 (
 [key2] = Array
 (
 [0] = value4
 [1] = value5
 [2] = value6
 )
 )
 
 It is a value item that I want to delete based on a 
 particular criteria.
 In each pass I may delete a value item. However, it seems that each
 subsequent pass operates on the original $results array and not
 the modified one.
 
 -Andres
 
 
 
 Daevid Vincent wrote:
   foreach ($results as $key = $item) 
   {
  if ($item == 'foo') unset($results[$key]);
   }
 

  -Original Message-
  From: Andres Gonzalez [mailto:and...@packetstorm.com] 
  Sent: Tuesday, June 23, 2009 11:27 AM
  To: php-general@lists.php.net
  Subject: [PHP] modifying within foreach
 
  In the following example:
 
  foreach ($results as $key = $item)  {
 
  //bla bla bla -- unset some of the $items
 
  }
 
  I want to modify $results within the foreach. In other words,
  during a given pass of this iteration, I want to delete some
  of the items based on particular conditions. Then on the next
  pass thru the foreach, I want $results to be the newer, modified
  array.
 
  This does not seem to work. It appears that the foreach statement
  is implemented such that $results is read into memory at the start
  so that any modifications I make to it during a given pass, 
  are ignored
  on the next pass. Is this true?
 
  If so, is there a way that I can tell the foreach statement 
  to re-read the
  array $results?  Or am I just going against the grain here?
 
  -Andres
 
 
  -- 
  PHP General Mailing List (http://www.php.net/)
  To unsubscribe, visit: http://www.php.net/unsub.php
 
  
 
 

 
 -- 
 PHP General Mailing List (http://www.php.net/)
 To unsubscribe, visit: http://www.php.net/unsub.php
 


-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] modifying within foreach

2009-06-23 Thread Andres Gonzalez

Thanks guys--passing by reference solved my problem. I was not aware
that the foreach statement works on a copy.  This was explained in the
online documentation.   Duh!!

Thanks again,

-Andres



Ashley Sheridan wrote:

On Tue, 2009-06-23 at 12:56 -0600, kirk.john...@zootweb.com wrote:
  

Andres Gonzalez and...@packetstorm.com wrote on 06/23/2009 12:26:38 PM:



I want to modify $results within the foreach. In other words,
during a given pass of this iteration, I want to delete some
of the items based on particular conditions. Then on the next
pass thru the foreach, I want $results to be the newer, modified
array.

This does not seem to work. It appears that the foreach statement
is implemented such that $results is read into memory at the start
so that any modifications I make to it during a given pass, are ignored
on the next pass. Is this true?
  
foreach works on a copy of an array, so the behavior you saw is expected. 
See the online manual.


You could use a while loop, or, instead of unset-ing elements of $results, 
store the elements you want to keep into a new array.


Kirk



What about passing it by reference?

foreach($results as $key = $item)
{
// modify items here
}

Thanks
Ash
www.ashleysheridan.co.uk

  


--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] modifying within foreach

2009-06-23 Thread Ashley Sheridan
On Tue, 2009-06-23 at 15:07 -0400, Eddie Drapkin wrote:
 It's just foreach($foo as $key = $item) { }
 
 You can't assign the key by reference .
 
 On Tue, Jun 23, 2009 at 3:04 PM, Ashley
 Sheridana...@ashleysheridan.co.uk wrote:
  On Tue, 2009-06-23 at 12:56 -0600, kirk.john...@zootweb.com wrote:
  Andres Gonzalez and...@packetstorm.com wrote on 06/23/2009 12:26:38 PM:
 
   I want to modify $results within the foreach. In other words,
   during a given pass of this iteration, I want to delete some
   of the items based on particular conditions. Then on the next
   pass thru the foreach, I want $results to be the newer, modified
   array.
  
   This does not seem to work. It appears that the foreach statement
   is implemented such that $results is read into memory at the start
   so that any modifications I make to it during a given pass, are ignored
   on the next pass. Is this true?
 
  foreach works on a copy of an array, so the behavior you saw is expected.
  See the online manual.
 
  You could use a while loop, or, instead of unset-ing elements of $results,
  store the elements you want to keep into a new array.
 
  Kirk
 
  What about passing it by reference?
 
  foreach($results as $key = $item)
  {
 // modify items here
  }
 
  Thanks
  Ash
  www.ashleysheridan.co.uk
 
 
  --
  PHP General Mailing List (http://www.php.net/)
  To unsubscribe, visit: http://www.php.net/unsub.php
 
 

Yeah, hehe, I was trying to remember off the top of my head, and
obviously forgot! :p

*slaps self*

Thanks
Ash
www.ashleysheridan.co.uk


-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] modifying within foreach

2009-06-23 Thread Robert Cummings

Ashley Sheridan wrote:

On Tue, 2009-06-23 at 15:07 -0400, Eddie Drapkin wrote:

It's just foreach($foo as $key = $item) { }

You can't assign the key by reference .

On Tue, Jun 23, 2009 at 3:04 PM, Ashley
Sheridana...@ashleysheridan.co.uk wrote:

On Tue, 2009-06-23 at 12:56 -0600, kirk.john...@zootweb.com wrote:

Andres Gonzalez and...@packetstorm.com wrote on 06/23/2009 12:26:38 PM:


I want to modify $results within the foreach. In other words,
during a given pass of this iteration, I want to delete some
of the items based on particular conditions. Then on the next
pass thru the foreach, I want $results to be the newer, modified
array.

This does not seem to work. It appears that the foreach statement
is implemented such that $results is read into memory at the start
so that any modifications I make to it during a given pass, are ignored
on the next pass. Is this true?

foreach works on a copy of an array, so the behavior you saw is expected.
See the online manual.

You could use a while loop, or, instead of unset-ing elements of $results,
store the elements you want to keep into a new array.

Kirk

What about passing it by reference?

foreach($results as $key = $item)
{
   // modify items here
}

Thanks
Ash
www.ashleysheridan.co.uk


--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php




Yeah, hehe, I was trying to remember off the top of my head, and
obviously forgot! :p

*slaps self*


Your brain is in PHP4 mode...

*slaps Ashley*

:)

Cheers,
Rob.
--
http://www.interjinn.com
Application and Templating Framework for PHP

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] modifying within foreach

2009-06-23 Thread Eddie Drapkin
It's just foreach($foo as $key = $item) { }

You can't assign the key by reference .

On Tue, Jun 23, 2009 at 3:04 PM, Ashley
Sheridana...@ashleysheridan.co.uk wrote:
 On Tue, 2009-06-23 at 12:56 -0600, kirk.john...@zootweb.com wrote:
 Andres Gonzalez and...@packetstorm.com wrote on 06/23/2009 12:26:38 PM:

  I want to modify $results within the foreach. In other words,
  during a given pass of this iteration, I want to delete some
  of the items based on particular conditions. Then on the next
  pass thru the foreach, I want $results to be the newer, modified
  array.
 
  This does not seem to work. It appears that the foreach statement
  is implemented such that $results is read into memory at the start
  so that any modifications I make to it during a given pass, are ignored
  on the next pass. Is this true?

 foreach works on a copy of an array, so the behavior you saw is expected.
 See the online manual.

 You could use a while loop, or, instead of unset-ing elements of $results,
 store the elements you want to keep into a new array.

 Kirk

 What about passing it by reference?

 foreach($results as $key = $item)
 {
    // modify items here
 }

 Thanks
 Ash
 www.ashleysheridan.co.uk


 --
 PHP General Mailing List (http://www.php.net/)
 To unsubscribe, visit: http://www.php.net/unsub.php



--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] modifying within foreach

2009-06-23 Thread Martin Scotta
AddBrainHandler x-httpd-php5 .php

On Tue, Jun 23, 2009 at 4:25 PM, Robert Cummings rob...@interjinn.comwrote:

 Ashley Sheridan wrote:

 On Tue, 2009-06-23 at 15:07 -0400, Eddie Drapkin wrote:

 It's just foreach($foo as $key = $item) { }

 You can't assign the key by reference .

 On Tue, Jun 23, 2009 at 3:04 PM, Ashley
 Sheridana...@ashleysheridan.co.uk wrote:

 On Tue, 2009-06-23 at 12:56 -0600, kirk.john...@zootweb.com wrote:

 Andres Gonzalez and...@packetstorm.com wrote on 06/23/2009 12:26:38
 PM:

  I want to modify $results within the foreach. In other words,
 during a given pass of this iteration, I want to delete some
 of the items based on particular conditions. Then on the next
 pass thru the foreach, I want $results to be the newer, modified
 array.

 This does not seem to work. It appears that the foreach statement
 is implemented such that $results is read into memory at the start
 so that any modifications I make to it during a given pass, are
 ignored
 on the next pass. Is this true?

 foreach works on a copy of an array, so the behavior you saw is
 expected.
 See the online manual.

 You could use a while loop, or, instead of unset-ing elements of
 $results,
 store the elements you want to keep into a new array.

 Kirk

 What about passing it by reference?

 foreach($results as $key = $item)
 {
   // modify items here
 }

 Thanks
 Ash
 www.ashleysheridan.co.uk


 --
 PHP General Mailing List (http://www.php.net/)
 To unsubscribe, visit: http://www.php.net/unsub.php



 Yeah, hehe, I was trying to remember off the top of my head, and
 obviously forgot! :p

 *slaps self*


 Your brain is in PHP4 mode...

 *slaps Ashley*

 :)

 Cheers,
 Rob.
 --
 http://www.interjinn.com
 Application and Templating Framework for PHP

 --
 PHP General Mailing List (http://www.php.net/)
 To unsubscribe, visit: http://www.php.net/unsub.php




-- 
Martin Scotta