ID: 19699 Updated by: [EMAIL PROTECTED] Reported By: [EMAIL PROTECTED] Status: Open Bug Type: Documentation problem Operating System: Windows -PHP Version: 4.2.3 +PHP Version: 4.2.3,4.3.0-dev New Comment:
updated version information. Previous Comments: ------------------------------------------------------------------------ [2002-10-03 16:27:08] [EMAIL PROTECTED] OK. Manual is incorrect here, in PHP4 functions either specify if an arg is passed by ref or by value. In array_walk only the first argument is ever passed by reference. I can see that passing userdata by reference would be nice but unfortuantly it is too much of a big change that could break too many scripts to make as this point as people may be relying on the fact it is passed by reference. For example function my_function($value, $key, $userdata) { $userdata = strrev($userdata.$key.$value); } $array1 = array("one", "two", "three")l $mydata = "array1"; array_walk($array1, 'my_function', $mydata); This POOR example would not work with thrid parameter passed by ref so for now am changing this to a documentation problem as the documentation is currently slightly misleading in it advocates using calltime pass by reference when infact the first param only is ever passed by reference. - James ------------------------------------------------------------------------ [2002-10-03 15:50:01] [EMAIL PROTECTED] I tried using the latest snapshot for Windows: System Windows 9x localhost 4.10 Build Date Oct 3 2002 20:15:03 but I still encounter the same problems. ------------------------------------------------------------------------ [2002-10-01 18:51:35] [EMAIL PROTECTED] Please try using this CVS snapshot: http://snaps.php.net/php4-latest.tar.gz For Windows: http://snaps.php.net/win32/php4-win32-latest.zip ------------------------------------------------------------------------ [2002-10-01 17:38:45] [EMAIL PROTECTED] The PHP manual contains the following note about 'array_walk()': Note: If func needs to be working with the actual values of the array, specify that the first parameter of func should be passed by reference. Then any changes made to those elements will be made in the array itself. So if you want to let 'array_walk()' pass the third parameter by reference, you're inclined to specify that the third parameter of func should be passed by reference. In the example underneath, the notation '&$userData' is used to specify so: function PrepareBowl($value, $key, &$userData) { print 'Mixed so far... ' . ($userData .= "$value ") . "<br>\n"; } $ingredients = array('peach', 'cherry', 'alchohol'); $bowl = ''; array_walk($ingredients, 'PrepareBowl', $bowl); print "Bowl: $bowl"; This doesn't work however; '$assembly' will not be passed by reference and the output will be an empty 'bowl': Mixed so far... peach Mixed so far... peach cherry Mixed so far... peach cherry alchohol Bowl: Only when you use the '&' notation within 'array_walk()' to specify that the third parameter should be passed by reference: array_walk($ingredients, 'PrepareBowl', &$bowl); the output will be as expected: Mixed so far... peach Mixed so far... peach cherry Mixed so far... peach cherry alchohol Bowl: peach cherry alchohol but, using the recommended php.ini setting 'allow_call_time_pass_reference=Off', you'll receive the warning: Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of array_walk(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. This looks the same like bug 4116 (http://bugs.php.net/bug.php?id=4116), posted Apr 12, 2000. Although this bug is closed with a reply that it works like the replier think it should work, this doesn't seem logic to me because the first parameter *is* passed by reference without specifying; try: array_walk(array('peach', 'cherry', 'alchohol'), 'PrepareBowl', &$bowl); and you'll receive: Fatal error: Only variables can be passed by reference ... Furthermore, I can't see much use of passing a third variable to 'array_walk()' by value, modify it by passing it to func by reference ... without receiving back the modified variable. Would it be a suggestion to let 'array_walk()' receive the third parameter by reference if specified so in the receiving func? This would be in line with the behaviour of the first parameter to func. Freddy Vulto ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=19699&edit=1 -- PHP Documentation Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php