php-general Digest 8 Jan 2012 15:53:09 -0000 Issue 7640

2012-01-08 Thread php-general-digest-help

php-general Digest 8 Jan 2012 15:53:09 - Issue 7640

Topics (messages 316211 through 316219):

Variable Troubleshooting Code
316211 by: Donovan Brooke
316212 by: David Courtin

Strange foreach reference issue
316213 by: Tim Behrendsen
316214 by: Stephen
316215 by: Matijn Woudt
316216 by: Tim Behrendsen
316217 by: Stephen
316218 by: Tim Behrendsen
316219 by: Adi Mutu

Administrivia:

To subscribe to the digest, e-mail:
php-general-digest-subscr...@lists.php.net

To unsubscribe from the digest, e-mail:
php-general-digest-unsubscr...@lists.php.net

To post to the list, e-mail:
php-gene...@lists.php.net


--
---BeginMessage---

Hello!,
I work in another language mostly and often develop while displaying 
variables (post,get,and defined) and their values at the bottom of the 
page or in specific places. So, I thought I'd forward my PHP version as 
an effort of good Karma to the list perhaps! ;-)


Below is 2 simple functions that are helpful for troubleshooting while 
developing. Just place this code into a .php file and require it at the 
top of any PHP page. Then, at the bottom of the page, or in a specific 
(more pertinent) location, call the functions with something like this:



?PHP
//troubleshooting code
print 'br /bTesting:/bp';

print htmlentities(list_formvars());

print htmlentities(list_vars(get_defined_vars()));

print '/p';
?
-

Optionally, you can call only specific naming conventions of your 
variables (if you use them).. ie:


print htmlentities(list_vars(get_defined_vars(),'t_'));

The above will display all defined vars such as:

t_name=value
t_city=value
t_address=value

etc..


Code:
---
/*
FUNCTION NAME: list_formvars
   INPUT: optional begins with var
   OUTPUT: Name = Value br /
 Name = Value br /
   USE: For troubleshooting code

   Example Use:
  list_formvars();
  list_formvars('f_a');

*/function list_formvars($pmatch = null) {
   print br /b'get' Vars:/bbr /;
   foreach ($_GET as $key = $value) {
if (isset($pmatch)) {
   if (substr($key,0,strlen($pmatch)) == $pmatch) {
  print $key = $valuebr /;
   }
} else {
   print $key = $valuebr /;
}
 }

   print br /b'post' Vars:/bbr /;
   foreach ($_POST as $key = $value) {
if (isset($pmatch)) {
   if (substr($key,0,strlen($pmatch)) == $pmatch) {
  print $key = $valuebr /;
   }
} else {
   print $key = $valuebr /;
}
 }
}/*
FUNCTION NAME: list_vars
   INPUT: get_defined_vars(),begins with match
   OUTPUT: Name = Value br /
 Name = Value br /
   USE: For troubleshooting code

   Example Use:
  list_vars(get_defined_vars());
  list_vars(get_defined_vars(),'t_');
*/function list_vars($a_vars,$pmatch = null) {
  print br /b'defined' Vars:/bbr /;
 foreach ($a_vars as $key = $value) {
if (isset($pmatch)) {
   if (substr($key,0,strlen($pmatch)) == $pmatch) {
  print $key = $valuebr /;
   }
} else {
   print $key = $valuebr /;
}
 }
}


Cheers,
Donovan


P.S. Always open to good criticism if you peeps see something that can 
be written better.. this is about my 3rd PHP project only... so, still 
heavily learning ;-)



--
D Brooke
---End Message---
---BeginMessage---
Hi,

some pretty natives php functions exists to do the job :
var_export — Outputs or returns a parsable string representation of a variable
debug_zval_dump — Dumps a string representation of an internal zend value to 
output
var_dump — Dumps information about a variable
print_r — Prints human-readable information about a variable

echo 'pre';
print_r( array | object );
echo '/pre';  

Regards.


Le 7 janv. 2012 à 19:00, Donovan Brooke a écrit :

 Hello!,
 I work in another language mostly and often develop while displaying 
 variables (post,get,and defined) and their values at the bottom of the page 
 or in specific places. So, I thought I'd forward my PHP version as an effort 
 of good Karma to the list perhaps! ;-)
 
 Below is 2 simple functions that are helpful for troubleshooting while 
 developing. Just place this code into a .php file and require it at the top 
 of any PHP page. Then, at the bottom of the page, or in a specific (more 
 pertinent) location, call the functions with something like this:
 
 
 ?PHP
 //troubleshooting code
 print 'br /bTesting:/bp';
   
 print htmlentities(list_formvars());
   
 print htmlentities(list_vars(get_defined_vars()));
   
 print '/p';
 ?
 -
 
 

Re: [PHP] Strange foreach reference issue

2012-01-08 Thread Adi Mutu
You can see here some nice pics, it's exactly as you said.

http://schlueters.de/blog/archives/141-References-and-foreach.html




 From: Tim Behrendsen t...@behrendsen.com
To: php-general@lists.php.net 
Cc: Stephen stephe...@rogers.com; Matijn Woudt tijn...@gmail.com 
Sent: Sunday, January 8, 2012 3:01 AM
Subject: Re: [PHP] Strange foreach reference issue
 
On 1/7/2012 4:44 PM, Stephen wrote:
 On 12-01-07 07:30 PM, Tim Behrendsen wrote:
 
 When you use an ampersand on the variable, that creates a reference to the 
 array elements, allowing you to potentially change the array elements 
 themselves (which I'm not doing here).
 
 http://www.php.net/manual/en/control-structures.foreach.php
 
 I do notice in the manual that it says, Reference of a $value and the last 
 array element remain even after the foreach loop. It is recommended to 
 destroy it by unset(). But that doesn't really explain why it contaminates 
 the next foreach loop in such an odd way. You would think that the $row in 
 the second loop would be assigned a non-reference value.
 
 Tim
 
 Tim,
 
 You are using the $variable in an unintended (by PHP designers), and I 
 suggest undefined manner.
 
 So the outcome cannot, but definition be explained.
 
 Was this intended, and what were you trying to accomplish?
 
 Stephen

In the real code, I just happen to use the same variable name first as a 
reference, and then as a normal non-reference, and was getting the mysterious 
duplicate rows.

I think I'm using everything in a completely reasonable way; the second foreach 
is reassigning the loop variable. Nothing that comes before using that variable 
ought to cause undefined behavior. The warning in the manual is about using the 
loop variable as a reference after exiting the loop, but I'm not doing that. 
I'm reassigning it, exactly as if I just decided to do a straight assignment of 
$row

Ah ha, wait a minute, that's the key. OK, this is making more sense.

The first loop is leaving a reference to the final element. But then the second 
foreach is doing a straight assignment to the $row variable, but $row is a 
reference to the final element. So the foreach is assigning its iterated value 
to the final element of the array, instead of a normal variable.

OK, I understand the logic now. The world now makes sense. The moral is always 
unset the iterator variable when doing foreach with a reference, like the 
manual says. :)

Thanks for everyone's help.

Tim

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

[PHP] questions from page Reference Counting Basics

2012-01-08 Thread Adi Mutu


Hello,

I was reading http://www.php.net/manual/en/features.gc.refcounting-basics.php, 
and i saw this:

The xdebug_debug_zval() function does not show this, but you could see it by 
also displaying the memory pointer.

My question is, how can you get the memory pointer of a php variable? 

Thanks,
A.