Is there a way to make this code work without a Warning?
function myFunction($value, $key, &$array)
{
if (strlen($value)<=2) $array[] = $key.$value;
}
$a = array("aa", "bbb", "cc", "dd");
$resultA = array();
array_walk($a, 'myFunction', &$resultA);
// now '$resultA' should contain: Array([0] => aa0 [1] => cc2 [2] => dd3)
It works, but it always throws this warning message:
Warning: Call-time pass-by-reference has been deprecated in path_to\index.php on line 7
I thought that removing the ampersand from the call should be enough to make the warning disappear, and it is, but, strangely the "array_walk" doesn't acomulate the third parameter if I just specify the & in "myFunction". To make it work there has to be an & in the call too, but then it will trigger the warning.
Further, as a temorary workaround I have tried to set the php.ini var "allow_call_time_pass_reference" to true, but I still get the warning...
I'm wondering that may be there's better/preferred method to apply user-defined functions to each element of an array WITH a passed-by-reference parameter.
The short answer is that you can't do that with array walk. However, you do have some alterantives:
Using a closure (available in PHP >= 5.3.0):
$myArray = array();
$callback = function ($key, $value) use (&$myArray) {
if (strlen($value) <= 2) {
$myArray[] = $key . $value;
}
};
array_walk($a, $callback);
Create a filter iterator (Note that this is likely way overkill):
class myFilterIterator extends FilterIterator {
public function accept() {
return strlen(parent::current()) <= 2;
}
public function current() {
return parent::key() . parent::current();
}
}
$it = new myFilterIterator(new ArrayIterator($a));
$newArray = iterator_to_array($it);
There are other ways, but you're appending of key and value really makes things difficult for mapping style solutions...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With