alle waardes in (sub)array trimmen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ozzie PHP

Ozzie PHP

24/11/2010 16:23:54
Quote Anchor link
Als ik een ini file inlees dan wil ik graag alle waardes / values trimmen. Ik gebruikte hiervoor array_map('trim', $array). Dit ging goed. Echter als de value zelf een array is (dit gebeurt wanneer je sections in je ini file gebruikt) dan gaat het fout en wordt de data verwijderd. Hoe kan ik ervoor zorgen dat alle values in de array getrimd worden?

Zie hier het voorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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));


Dit geeft als resultaat:

array(1) { ["beest"]=> string(3) "koe" }

array(1) { ["beest"]=> string(5) "Array" }
 
PHP hulp

PHP hulp

12/01/2025 00:54:10
 
Chris -

Chris -

24/11/2010 16:54:28
Quote Anchor link
Kun je niet een (recursieve) functie gebruiken, die kijkt of het een array is en dan de array (recursief dus) uitleest?
 
Ozzie PHP

Ozzie PHP

24/11/2010 17:10:47
Quote Anchor link
Ja dat zou kunnen... als ik zou begrijpen wat je zegt :-?
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?)
 

24/11/2010 17:16:08
Quote Anchor link
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.
 
Ozzie PHP

Ozzie PHP

24/11/2010 19:14:02
Quote Anchor link
Ik heb dit geprobeerd; array_walk_recursive($b, 'trim');
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?
 

24/11/2010 20:09:51
Quote Anchor link
Owja, die functie werkt niet by reference, staat er ook uitgelegd (maar ik deed het uit mijn hoofd). Met create_function kan je een anonieme functie maken die wel kan trimmen by reference.
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.
 
Ozzie PHP

Ozzie PHP

24/11/2010 22:36:17
Quote Anchor link
Pfff... ik zit nu al een tijdje te klooien en heb het als volgt:

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
 

24/11/2010 22:59:35
Quote Anchor link
Hmm... Hiervoor heb ik die zooi dus ook in een snippit zitten, om te zorgen dat dingen niet door elkaar gaan (en ook is het misschien wat slimmer om niet te multi-tasken). Trim doet return van de waarde (geen by reference dus). Dus je moet zelf $a nog aanpassen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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)
*/

?>
Gewijzigd op 24/11/2010 23:01:11 door
 
Ozzie PHP

Ozzie PHP

24/11/2010 23:14:08
Quote Anchor link
thanks :)
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)?
 

24/11/2010 23:24:51
Quote Anchor link
Das dezelfde manier als mij :-) klopt dus als een bus :-D

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.
 
Ozzie PHP

Ozzie PHP

24/11/2010 23:36:22
Quote Anchor link
Ah oke, thanks Karl :)
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
 

24/11/2010 23:43:34
Quote Anchor link
Als callback: closure
 
Ozzie PHP

Ozzie PHP

24/11/2010 23:52:02
Quote Anchor link
Huh? Moet ik dan nog steeds die creatae_dunction gebruiken? (Heb geen php 5.3.0 overigens wat volgens mij nodig hiervoor is).

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.
 

24/11/2010 23:56:05
Quote Anchor link
Euh, voor closures zal je vast wel 5.3 nodig hebben ja (al die nieuwe leuke dingetjes zijn er pas vanaf 5.3 :-(). Als je een closure gebruikt, dan heb je dus geen create_function nodig.
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).
 
Jelmer -

Jelmer -

24/11/2010 23:59:57
Quote Anchor link
Een ingewikkelde manier om toch soort-van variabelen mee te kunnen geven aan zo'n anonieme functie: een class.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>
 
Ozzie PHP

Ozzie PHP

25/11/2010 00:00:47
Quote Anchor link
Hmmm oke... waarom is dat PHP 5.3 nog geen standaard (grrrr)

Ik snap overigens niet... op php.net staat dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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";

Hier stoppen ze die create_function wel in een variabele. Waarom gaat dat bij mij dan niet??

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$nieuwe_functie = create_function('&$value', '$value = trim($value);');
array_walk_recursive($b, $nieuwe_functie($b));
 
Jelmer -

Jelmer -

25/11/2010 00:04:04
Quote Anchor link
Je roept de functie daar aan, terwijl je hem alleen maar wilt meegeven:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
array_walk_recursive($b, $nieuwe_functie);
 
Ozzie PHP

Ozzie PHP

25/11/2010 00:06:58
Quote Anchor link
Krek... krijg nou wat, zo doet ie het inderdaad wel :)

Bedankt allemaal voor jullie bijdrage :)
Gewijzigd op 25/11/2010 00:07:50 door Ozzie PHP
 

25/11/2010 00:15:39
Quote Anchor link
Ah, jah. Was weer eens niet aan het opletten :+)
 
Ozzie PHP

Ozzie PHP

25/11/2010 07:22:03
Quote Anchor link
Toch nog even een vraag. Als ik nu van iedere array die ik van externe bronnen (bijvoorbeeld een .ini bestand of een excel / csv spreadsheet) binnenhaal de values wil trimmen, hoe zouden jullie dat dan doen en waarom?

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?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.