[PHP/MYSQL]trim

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Zillion01
  • Registratie: Juni 2001
  • Laatst online: 22-11-2023

Zillion01

Obey your screen!

Topicstarter
Ik gebruik de volgende code om een lijst van keywords te krijgen uit een tekstveld waarin per waarde meerdere woorden kunnen staan met spaties :

code:
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
<?php

$query = "SELECT * FROM tabel";
$res=safe_mysql_query($query);

$teller=1;

while ($arr = mysql_fetch_assoc($res)) 
{
$trimmed = trim($arr["keywords"]); //trim whitespace
$trimmed_array[$teller] = explode(" ",$trimmed); //separate key-phrases into keywords
$teller++;
}

$tel=1;
while ($tel<$teller) {
foreach ($trimmed_array[$tel] as $trimm)
{
echo $trimm."<br>";
} 
$tel++;
}
 

?>


Nu trim ik die woorden van spaties om het resultaat (de keywords) daarna als een lijst te echo-en. Nu gaat dat goed voor 1 spatie maar als er meerdere spaties achter elkaar staan worden de spaties als resultaat weergegeven. Hoe kan ik dat voorkomen? tx

[ Voor 7% gewijzigd door Zillion01 op 05-04-2006 15:20 ]


Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 09:57

Gonadan

Admin Beeld & Geluid, Harde Waren
Omdat trimmen alleen om het woord gebeurd, en niet tussen de woorden. :)

Edit:
En je explode op spaties, dus als er meerdere spaties zijn dan is er dus een resultaat :)

[ Voor 43% gewijzigd door Gonadan op 05-04-2006 15:21 ]

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

doe eens eens op regel 14 een print_r($trimmed_array); ? moet de vraag beter lezen :|

[ Voor 25% gewijzigd door TheRookie op 05-04-2006 15:28 ]


Acties:
  • 0 Henk 'm!

Anoniem: 88197

Eerste alle dubbele spaties vervangen door 1 spatie. Je bent echt niet de eerste met dat probleem :)

Lelijk trouwens dit, zo gebruik je je database niet goed. Zorg dat je een tabel met keywords hebt en zet ze daar LOS in per record, dus niet per record meerdere keywords.

[ Voor 47% gewijzigd door Anoniem: 88197 op 05-04-2006 15:33 ]


Acties:
  • 0 Henk 'm!

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

@Boland: je hebt het datamodel niet altijd voor het kiezen c.q. de mogelijkheid om dit te beinvloeden ...

Acties:
  • 0 Henk 'm!

  • Zillion01
  • Registratie: Juni 2001
  • Laatst online: 22-11-2023

Zillion01

Obey your screen!

Topicstarter
Gonadan schreef op woensdag 05 april 2006 @ 15:20:
Omdat trimmen alleen om het woord gebeurd, en niet tussen de woorden. :)

Edit:
En je explode op spaties, dus als er meerdere spaties zijn dan is er dus een resultaat :)
Dus dat zou betekenen dat als er spaties voorkomen dat maximaal 1 per keer is...

en idd als ik regel 19 verander in
code:
1
2
if (!empty($trimm)){
echo $trimm."<br>";}
dan werkt het goed, ongeacht hoeveel spaties er in voorkomen. :)
Anoniem: 88197 schreef op woensdag 05 april 2006 @ 15:32:
Eerste alle dubbele spaties vervangen door 1 spatie. Je bent echt niet de eerste met dat probleem :)

Lelijk trouwens dit, zo gebruik je je database niet goed. Zorg dat je een tabel met keywords hebt en zet ze daar LOS in per record, dus niet per record meerdere keywords.
Inderdaad zou ik dat bij het invoeren van die keywords al moeten laten doen.. echter die keywords los per object vind ik lastig, dat blijft gewoon ff een tekstveld voorlopig. tx

[ Voor 6% gewijzigd door Zillion01 op 05-04-2006 15:41 ]


Acties:
  • 0 Henk 'm!

Anoniem: 88197

TheRookie schreef op woensdag 05 april 2006 @ 15:36:
@Boland: je hebt het datamodel niet altijd voor het kiezen c.q. de mogelijkheid om dit te beinvloeden ...
Was ook meer een tip natuurlijk... En blijkbaar kan hij het wel aanpassen :9

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

Dit datamodel blijft smerig, maar het probleem is veel sneller op te lossen. Zet dit maar eens in die while neer:
PHP:
1
$trimmed_array[] = preg_replace("/\s+/", "<br>", $arr["keywords"]);

$teller is ook nutteloos als alles wat je wil het toevoegen van een element aan een array is. ;)
Edit: Of als je het zaakje in een tweedimensionaal array wil hebben:
PHP:
1
$trimmed_array[] = preg_split("/\s+/", $arr["keywords"]);

[ Voor 19% gewijzigd door NMe op 05-04-2006 16:39 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Zillion01
  • Registratie: Juni 2001
  • Laatst online: 22-11-2023

Zillion01

Obey your screen!

Topicstarter
-NMe- schreef op woensdag 05 april 2006 @ 16:38:
Dit datamodel blijft smerig, maar het probleem is veel sneller op te lossen. Zet dit maar eens in die while neer:
PHP:
1
$trimmed_array[] = preg_replace("/\s+/", "<br>", $arr["keywords"]);

$teller is ook nutteloos als alles wat je wil het toevoegen van een element aan een array is. ;)
Edit: Of als je het zaakje in een tweedimensionaal array wil hebben:
PHP:
1
$trimmed_array[] = preg_split("/\s+/", $arr["keywords"]);
Sry ik ben behoorlijk een n00b, het is ook pittig om tegelijkertijd mysql en php te leren ;)

Dank je dat voorbeeld werkt goed echter ik was net aan het kijken om er idd een eendimonsionale tabel van te maken zodat ik array_unique er van kan maken.

Echter als ik jou suggestie toepas krijg ik een array van 26 arrays en er staan nog steeds bijvoorbeeld kommas en punten in. ( Er zijn totaal 26 records die allemaal keywords hebben in een tekstveld). Dus hoe kan ik er 1 array van maken.

Poging :

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

$query = "SELECT * FROM tabel";
$res=safe_mysql_query($query);
$trimmed_array=array();
while ($arr = mysql_fetch_assoc($res)) {
$een_enkele_trimmed_array = preg_replace("/\s+/", "<br>", $arr["keywords"]);
foreach ($een_enkele_trimmed_array as $temptrim) {
$trimmed_array=$trimmed_array+$temptrim;
} 
}

print_r($trimmed_array); 
 
mysql_free_result($res); 
?>


Error : Warning: Invalid argument supplied for foreach()

[ Voor 50% gewijzigd door Zillion01 op 05-04-2006 17:45 ]


Acties:
  • 0 Henk 'm!

Anoniem: 88197

Dan komt er uit regel 7 dus geen array he :)

Regel 9 hoort IMO ook niet zo...
Echter als ik jou suggestie toepas krijg ik een array van 26 arrays en er staan nog steeds bijvoorbeeld kommas en punten in. ( Er zijn totaal 26 records die allemaal keywords hebben in een tekstveld). Dus hoe kan ik er 1 array van maken.
Je hebt nog nooit iets gezegd over punten en komma's :?

[ Voor 97% gewijzigd door Anoniem: 88197 op 05-04-2006 19:07 ]


Acties:
  • 0 Henk 'm!

  • Zillion01
  • Registratie: Juni 2001
  • Laatst online: 22-11-2023

Zillion01

Obey your screen!

Topicstarter
Anoniem: 88197 schreef op woensdag 05 april 2006 @ 19:04:
Dan komt er uit regel 7 dus geen array he :)

Regel 9 hoort IMO ook niet zo...


[...]

Je hebt nog nooit iets gezegd over punten en komma's :?
yep sry.. ik had daar nog nix overgezegd

echter als ik een_enkel_trimmed_aray print_r doe dan komen er gewoon wel waarden te staan, echter die foreach slikt het denk ik niet als er een keer geen waarde is, kun je daar een check op gooien?

Eigenlijk is de vraag (ik ben daar nu al 2 uur naar aan het zoeken) hoe kun je van een tweedimensionale tabel een eendimensionale tabel maken.

dus

ipv

Array ( [0] => bla
hoi
test
gedoe [1] => bla2
koekeloe
hopla [2] => bla3
blabla)


naar iets als

Array ( [0] => bla
[1] =>hoi
[2] => test
..etc)

[ Voor 33% gewijzigd door Zillion01 op 05-04-2006 19:24 ]


Acties:
  • 0 Henk 'm!

Anoniem: 88197

Dan maak je een array met 1 element :?
Ah, ge-edit.
PHP:
1
2
3
4
$result = array();
foreach $array as $elt
  foreach $elt as $a
    $result[]= $a

Klaar :)

Bij die 2d-array schrijf je het verkeerd op...
echter als ik een_enkel_trimmed_aray print_r doe dan komen er gewoon wel waarden te staan, echter die foreach slikt het denk ik niet als er een keer geen waarde is, kun je daar een check op gooien?
Dat is bullshit..

[ Voor 120% gewijzigd door Anoniem: 88197 op 05-04-2006 19:28 ]


Acties:
  • 0 Henk 'm!

  • Zillion01
  • Registratie: Juni 2001
  • Laatst online: 22-11-2023

Zillion01

Obey your screen!

Topicstarter
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php

$query = "SELECT * FROM tabel";
$res=safe_mysql_query($query);
$trimmed_array=array();
$een_enkele_trimmed_array=array();

while ($arr = mysql_fetch_assoc($res)) 
{
$een_enkele_trimmed_array=preg_replace("/\s+/", "<br>", $arr["keywords"]);
foreach ($een_enkele_trimmed_array as $elt){
    foreach ($elt as $a){
                                      $trimmed_array[]= $a;
                                   
                                                                 }
} 
}

print_r($trimmed_array); 

mysql_free_result($res); 
?>


Zelfde foutmelding helaas... Invalid argument supplied for foreach
Dat is bullshit..
Hmm en het feit dat ernog komma's e.d. in zitten kan er ook nix mee te maken hebben?

[ Voor 14% gewijzigd door Zillion01 op 05-04-2006 19:41 ]


Acties:
  • 0 Henk 'm!

Anoniem: 88197

Hmm en het feit dat ernog komma's e.d. in zitten kan er ook nix mee te maken hebben?
Er zitten toch gewoon strings in? Ik heb geen verstand van preg_replace en jij helemaal niet volgens mij :) Maar volgens mij komt er uit preg_replace helemaal geen array, maar een string :?

Een array van arrays samenvoegen tot 1 array moet echt op mijn manier... Wat hebben die komma's er mee te maken :? Dat zit ook in de invoer? Wat moet daar mee gebeuren? Daar zeg je nu nog steeds niets over...

Ik zou er echt heel hard over na gaan denken je datamodel om te gaan gooien, het wordt wel heel erg ranzig op deze manier :X

[ Voor 17% gewijzigd door Anoniem: 88197 op 05-04-2006 19:44 ]


Acties:
  • 0 Henk 'm!

Anoniem: 26306

@Kojak2001
Ik mag hopen dat je toch wel het verschil tussen preg_replace en preg_split ziet? Kijk gewoon in de PHP manual hoe die functies werken, speel er wat mee tot je begrijpt wat het doet en hoe je het kunt gebruiken, en pas het dan pas toe in je script. Je huidige manier van werken is recipe for disaster.

[ Voor 3% gewijzigd door Anoniem: 26306 op 05-04-2006 19:44 ]


Acties:
  • 0 Henk 'm!

  • Zillion01
  • Registratie: Juni 2001
  • Laatst online: 22-11-2023

Zillion01

Obey your screen!

Topicstarter
Nou het zal jullie wel een gruwel in het oog zijn maar voorlopig heb ik iets werkends gemaakt :

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
27
28
29
30
31
32
33
34
<?php

$query = "SELECT * FROM tabel";
$res=safe_mysql_query($query);

while ($arr = mysql_fetch_assoc($res)) 
{
$trimmed = trim($arr["keywords"]); //trim whitespace
$trimmed_array[] = explode(" ",$trimmed); //separate key-phrases into keywords
}

//print_r($trimmed_array);

$aantal= count($trimmed_array);
$teller=0;
$lijstkeywords=array();
while ($teller<$aantal) {
    foreach ($trimmed_array[$teller] as $trimm)
        {
        array_push ($lijstkeywords,$trimm);
        } 
    $teller++;
}
//print_r($lijstkeywords);
$lijstkeywords= array_unique ($lijstkeywords);
echo "<br>";
sort($lijstkeywords);
foreach ($lijstkeywords as $keywoordje) {
echo $keywoordje."<br>";}

//print_r($lijstkeywords);
mysql_free_result($res); 

?>


mazzel :P

Acties:
  • 0 Henk 'm!

Anoniem: 88197

Echt heel mooi :+ Vooral zo doorgaan, produceer je wel robuuste code ;)

Maar goed dat je het zelf ook door hebt dat dit ontiegelijk ranzig is :D Bijv: die teller slaat nergens op... Zoals NMe ook al aangeeft...

[ Voor 19% gewijzigd door Anoniem: 88197 op 05-04-2006 20:46 ]


Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 10:35

orf

PHP heeft hier gewoon een functie voor ;)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php

$str = "Hello fri3nd, you're
       looking          good today!";

print_r(str_word_count($str, 1));
print_r(str_word_count($str, 2));
print_r(str_word_count($str, 1, 'àáãç3'));

echo str_word_count($str);

?> 

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

Anoniem: 88197 schreef op woensdag 05 april 2006 @ 20:45:
Maar goed dat je het zelf ook door hebt dat dit ontiegelijk ranzig is :D Bijv: die teller slaat nergens op... Zoals NMe ook al aangeeft...
Nou, in dit geval is ie anders wel nodig om die code werkend te houden. ;) Al zou ik er zelf gewoon een tweede foreach van maken in plaats van dat tellertje bijhouden. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Anoniem: 88197

-NMe- schreef op woensdag 05 april 2006 @ 21:00:
[...]

Nou, in dit geval is ie anders wel nodig om die code werkend te houden. ;) Al zou ik er zelf gewoon een tweede foreach van maken in plaats van dat tellertje bijhouden. :)
Ik dacht dat je dat ook bedoelde ;)

Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 10:35

orf

Al zou ik er zelf gewoon een tweede foreach van maken in plaats van dat tellertje bijhouden.
En niet gewoon een functie gebruiken die hiervoor bedoeld is?

Acties:
  • 0 Henk 'm!

Anoniem: 88197

orf schreef op woensdag 05 april 2006 @ 21:12:
[...]


En niet gewoon een functie gebruiken die hiervoor bedoeld is?
Dat is inderdaad nog beter, maar ik had zelf nog nooit gehoord van die hele functie...

Acties:
  • 0 Henk 'm!

  • Zillion01
  • Registratie: Juni 2001
  • Laatst online: 22-11-2023

Zillion01

Obey your screen!

Topicstarter
orf schreef op woensdag 05 april 2006 @ 20:53:
PHP heeft hier gewoon een functie voor ;)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php

$str = "Hello fri3nd, you're
       looking          good today!";

print_r(str_word_count($str, 1));
print_r(str_word_count($str, 2));
print_r(str_word_count($str, 1, 'àáãç3'));

echo str_word_count($str);

?> 
? en dat resulteert in :

code:
1
2
3
Array ( [0] => Hello [1] => fri [2] => nd [3] => you're [4] => looking [5] => good [6] => today ) Array ( [0] => Hello [6] => fri [10] => nd [14] => you're [29] => looking [46] => good [51] => today )
Warning: Wrong parameter count for str_word_count() in /home/xxxxx/public_html/test/test.php on line 8
7


Graag iets minder cryptisch, wat kan ik hiermee ?

Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 10:35

orf

Graag iets minder cryptisch, wat kan ik hiermee ?
Dit is het voorbeeld uit de manual, misschien moet je dan ook even kijken in de manual, wat voor argumenten deze functie slikt.

Je ziet dat in de eerste drie gevallen, je een array met woorden terug krijgt. In het derde voorbeeld is een karakterset opgenomen zodat een woord met bijvoorbeeld een '3' erin als één woord wordt beschouwd.

Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
http://be2.php.net/str_word_count

str_word_count verwacht een string, geen array.

/edit
Beter lezen :p Hm, dat voorbeeld werkt hier wel :?

[ Voor 27% gewijzigd door XWB op 05-04-2006 23:12 ]

March of the Eagles

Pagina: 1