From: kranthi on 29 Aug 2010 00:35 i have an array $parms = array('1' => 'a', 'b' => array(3 => 'test')); i want $mail = '1:a 3:test'; array_walk_recursive($parms, function($val, $key, &$mail) { $mail .= ucwords($key) . ': '. ucwords($val) . "\n"; }, &$mail); The above function worked perfectly well but i am getting: Call-time pass-by-reference has been deprecated in /var/www/html/test.php on line 31 if i change it to array_walk_recursive($parms, function($val, $key, &$mail) { $mail .= ucwords($key) . ': '. ucwords($val) . "\n"; }, $mail); i am not getting the error but $mail is not being returned. ny solution ? Regards KK
From: Adam Richardson on 29 Aug 2010 13:58 On Sun, Aug 29, 2010 at 12:35 AM, kranthi <kranthi117(a)gmail.com> wrote: > i have an array > $parms = array('1' => 'a', 'b' => array(3 => 'test')); > i want $mail = '1:a 3:test'; > But you're uppercasing and adding new lines and additional spaces, so I hope you want (at least, this is what I tested against): "1: A\n3: Test\n" > > array_walk_recursive($parms, function($val, $key, &$mail) { > $mail .= ucwords($key) . ': '. ucwords($val) . "\n"; > }, &$mail); > This worked just as you said. > > The above function worked perfectly well > but i am getting: Call-time pass-by-reference has been deprecated in > /var/www/html/test.php on line 31 > > if i change it to > > array_walk_recursive($parms, function($val, $key, &$mail) { > $mail .= ucwords($key) . ': '. ucwords($val) . "\n"; > }, $mail); > > i am not getting the error but $mail is not being returned. > This failed just as you said. Note, the function signature does not say userdata is passed by reference. So, by the time your function is called, the original reference has already been lost and your function is getting a reference to a copy (bummer, I know.) bool *array_walk_recursive* ( array &$input , callback<language.pseudo-types.php#language.types.callback> $funcname [, mixed <language.pseudo-types.php#language.types.mixed> $userdata ] ) > > ny solution ? > > For a quick fix, I'd use an object, which is pass by reference by nature: class StringWrapper { public $string = ''; } $mail = new StringWrapper(); array_walk_recursive($parms, function($val, $key, $mail) { $mail->string .= ucwords($key) . ': '. ucwords($val) . "\n"; }, $mail); if ($mail->string == "1: A\n3: Test\n") { echo 'Yes, this worked'; } else { echo 'No, not again.'; } You could also use a static method from a class and forget about passing the $userdata variable, or use a static variable within the function itself to maintain state. That said, I've had several situations where I would have preferred the ease of passing the userdata argument by reference, so I feel your pain. Adam -- Nephtali: PHP web framework that functions beautifully http://nephtaliproject.com
|
Pages: 1 Prev: Questions about $_SERVER Next: Put all class in one file or different files |