alle waardes in (sub)array trimmen
Zie hier het voorbeeld:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
$a = array('beest' => ' koe ');
$b = array('beest' => array(' koe ', ' vogel '));
var_dump(array_map('trim', $a));
echo '<br><br>';
var_dump(array_map('trim', $b));
$b = array('beest' => array(' koe ', ' vogel '));
var_dump(array_map('trim', $a));
echo '<br><br>';
var_dump(array_map('trim', $b));
Dit geeft als resultaat:
array(1) { ["beest"]=> string(3) "koe" }
array(1) { ["beest"]=> string(5) "Array" }
Kun je niet een (recursieve) functie gebruiken, die kijkt of het een array is en dan de array (recursief dus) uitleest?
Ik heb nog nooit een recursieve functie gebruikt en weet dus niet hoe jij dat precies voor je ziet. Ik had gehoopt dat er en simpele oplossing voor was (of is jouw oplossing simpel?)
array_walk_recursive simpel.
Volgens mij kan die al direct trim pakken. Anders kan je die effe in een anonieme functie dumpen met create_function.
Volgens mij kan die al direct trim pakken. Anders kan je die effe in een anonieme functie dumpen met create_function.
Weliswaar krijg ik nu de complete array terug, maar er wordt niks getrimd :(
Ik snap niet wat je bedoelt met dat ik een functie moet aanmaken... waarom, en vooral.. hoe?
Dan wordt het zo:
array_walk_recursive($array, create_function('&$a', 'trim($a)'));
als het goed is. Verder kan je ook nog testen wat er gebeurd als je & voor $array zet. Ook kan het nog zijn dat je return voor trim moet zetten.
array_walk_recursive(&$a, create_function('$a', 'trim(&$a);'));
Maar telkens als ik $ var_dump dan is de waarde niet getrimd. Met & zonder & met return zonder return... het maakt allemaal niks uit :s
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
$blaat = array(' test', 'test ', ' test ', array(' test', 'test ', ' test '));
var_dump($blaat);
array_walk_recursive($blaat, create_function('&$a', '$a = trim($a);'));
var_dump($blaat);
/* Levert:
array
0 => string ' test' (length=5)
1 => string 'test ' (length=7)
2 => string ' test ' (length=8)
3 =>
array
0 => string ' test' (length=5)
1 => string 'test ' (length=7)
2 => string ' test ' (length=8)
array
0 => string 'test' (length=4)
1 => string 'test' (length=4)
2 => string 'test' (length=4)
3 =>
array
0 => string 'test' (length=4)
1 => string 'test' (length=4)
2 => string 'test' (length=4)
*/
?>
$blaat = array(' test', 'test ', ' test ', array(' test', 'test ', ' test '));
var_dump($blaat);
array_walk_recursive($blaat, create_function('&$a', '$a = trim($a);'));
var_dump($blaat);
/* Levert:
array
0 => string ' test' (length=5)
1 => string 'test ' (length=7)
2 => string ' test ' (length=8)
3 =>
array
0 => string ' test' (length=5)
1 => string 'test ' (length=7)
2 => string ' test ' (length=8)
array
0 => string 'test' (length=4)
1 => string 'test' (length=4)
2 => string 'test' (length=4)
3 =>
array
0 => string 'test' (length=4)
1 => string 'test' (length=4)
2 => string 'test' (length=4)
*/
?>
Ik heb het nu zo, waarbij $a de te bewerken array is:
array_walk_recursive($a, create_function('&$value', '$value = trim($value);'));
Maar als ik het nu dus goed begrijp doorloopt array_walk_recursive iedere key in de array en onderwerpt de waarde van de key aan de zelf gemaakte functie. Correct?
Heb ik nog wel 2 vragen:
1) waarom kun je niet gewoon trim() gebruiken, maar moet je een functie createn?
2) wanneer en waarom gebruik je create_function (en waarom niet een "gewone" functie)?
1) Naja, zoals je gemerkt hebt kan dat niet. Die walk recursive verwacht een callback. Ik zou niet weten hoe je een callback naar trim kan doen met de parameter als reference, op deze manier na.
2) Deze 'functie' is alleen hier nodig, dus doe je hem effe anoniem hier maken. Je hoeft niet de rest te 'vervuilen' met een functie die echt alleen hier nodig is.
Inderdaad dezelfde manier als jou... anders had ik het ook niet voor elkaar gekregen!
Kun je zo'n create_function ook in een variabele stoppen? Want nu maakt ie voor iedere key in de array dezelfde functie aan (of niet??).
Dus zoiets als:
$functie_trim = create_function('&$value', '$value = trim($value);')
array_walk_recursive($a, $functie_trim($a));
Heb net even lopen klooien, maar werkt niet echt :s
callback: closure
Als Als deze oplossing...
array_walk_recursive($a, create_function('&$value', '$value = trim($value);'));
...volgens jou niet verkeerd is dan laat ik het wel zo. Maar het lijkt nu alsof ie voor iedere key telkens opnieuw een functie aanmaakt. Tenzij ik dat verkeerd zie.
En inderdaad, er wordt tijdelijk een functie aangemaakt (maar die gaat geloof ik nadat je hem hebt gebruikt ook weer weg, althans dat verwacht ik, maar ik weet niet of php's garbage collector zo slim is).
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
class Filter_Trim
{
private $chars;
public function __construct($chars = "\t ")
{
$this->_chars = $chars;
}
public function apply(&$value)
{
$value = trim($value, $this->_chars);
}
}
$test = array('xax', 'bxx', array('xcxx', 'd', array('xxe')));
array_walk_recursive($test, array(new Filter_Trim('x'), 'apply'));
var_dump($test);
?>
class Filter_Trim
{
private $chars;
public function __construct($chars = "\t ")
{
$this->_chars = $chars;
}
public function apply(&$value)
{
$value = trim($value, $this->_chars);
}
}
$test = array('xax', 'bxx', array('xcxx', 'd', array('xxe')));
array_walk_recursive($test, array(new Filter_Trim('x'), 'apply'));
var_dump($test);
?>
Ik snap overigens niet... op php.net staat dit:
Code (php)
1
2
3
2
3
$newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
echo "New anonymous function: $newfunc\n";
echo $newfunc(2, M_E) . "\n";
echo "New anonymous function: $newfunc\n";
echo $newfunc(2, M_E) . "\n";
Hier stoppen ze die create_function wel in een variabele. Waarom gaat dat bij mij dan niet??
Ah, jah. Was weer eens niet aan het opletten :+)
Zou je in iedere functie waar je een array wil trimmen even gauw een trim functie aanmaken met create_function? Of zouden jullie er dan toch een losstaande functie van maken? Wat is vanuit het ooogpunt van performance de beste oplossing?