Toon posts:

[PHP] Exploden per karakter

Pagina: 1
Acties:

Verwijderd

Topicstarter
Het is al een paar jaar geleden dat ik voor het laatst actief wat op GoT, maar zit nu wel met een heel vreemd probleempje. Ik heb op een website een hoop directories met foto's staan. Hier wil ik een soor tvan gallery script omheen bouwen om alles toegankelijk te maken. Nu is dat allemaal wel gelukt, maar ik zit met het probleem dat ik de naamgeving van de mappen leesbaar wil maken. Momenteel zijn alle mappen op de volgende manier genoemd "YYYYMMDD". Leesbaar voor ons zou zijn 'DD-MM-YYYY". Nu is er op internet niet echt iets over een situatie als deze geschreven dus ben ik zelf vanalles aan het uitproberen gegaan. Mijn hoop lag dan ook al snel bij de explode functie, maar in beide voorbeelden hieronder ging het fout;

PHP:
1
2
3
4
$filename = '20070516';
$linktitle = explode ("*", $filename);
$linktitletotal = $linktitle[6].$linktitle[7].'-'.$linktitle[4].$linktitle[5].'-'.$linktitle[0].$linktitle[1].$linktitle[2].$linktitle[3];
echo $linktitle;


PHP:
1
2
3
4
$filename = '20070516';
$linktitle = explode ("", $filename);
$linktitletotal = $linktitle[6].$linktitle[7].'-'.$linktitle[4].$linktitle[5].'-'.$linktitle[0].$linktitle[1].$linktitle[2].$linktitle[3];
echo $linktitle;


Weet iemand nog een oplossing die wel werkt?

Thanks!

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 22:14

orf

kijk eens naar substr

  • Walance
  • Registratie: September 2005
  • Laatst online: 24-11 21:48

Walance

Hm.. wat zal ik hier schrijven

Je zou het op deze manier kunnen doen:

PHP:
1
2
3
4
$jaar = substr($filename, 0, 4);
$maand = substr($filename, 5, 2);
$dag = substr($filename, 7, 2);
echo $dag . ' - ' . $maand . ' - ' . $jaar;


Dat moet volgens mij wel werken zo, tenzij je perse het met de explode functie wilt doen...

[ Voor 0% gewijzigd door Walance op 15-06-2007 13:05 . Reden: typo ]


Verwijderd

Topicstarter
Conquerer schreef op vrijdag 15 juni 2007 @ 12:55:
Je zou het op deze manier kunnen doen:
Thanks, werkt idd super. Wel een kleine aanpassing gemaakt ivbm de telling ;)

PHP:
1
2
3
4
$jaar = substr($filename, 0, 4); 
$maand = substr($filename, 4, 2); 
$dag = substr($filename, 6, 2); 
echo $dag . ' - ' . $maand . ' - ' . $jaar;

  • sc0rpz
  • Registratie: November 2003
  • Laatst online: 23-09-2021
of nog mooier:
PHP:
1
$linktitle = preg_replace('/(\d{4})(\d{2})(\d{2})/','\\3-\\2-\\1',$filename);


Btw: als je hier al moeite mee hebt moet je misschien ff je PHP weer een beetje oppoetsen, want het kiezen voor explode is eigenlijk totaal onlogisch, zowieso regexp ff ophalen

[ Voor 44% gewijzigd door sc0rpz op 15-06-2007 13:06 ]


  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

sc0rpz schreef op vrijdag 15 juni 2007 @ 13:03:
of nog mooier:
PHP:
1
$linktitle = preg_replace('/(\d{4})(\d{2})(\d{2})/','\\3-\\2-\\1',$filename);


Btw: als je hier al moeite mee hebt moet je misschien ff je PHP weer een beetje oppoetsen, want het kiezen voor explode is eigenlijk totaal onlogisch, zowieso regexp ff ophalen
Waarom zou je voor dit een regexp gebruiken terwijl je ook klaar bent met een drietal simpele substr's?

  • sc0rpz
  • Registratie: November 2003
  • Laatst online: 23-09-2021
Waarom zou je voor dit een regexp gebruiken terwijl je ook klaar bent met een drietal simpele substr's?
Waarom niet, houdt de code lekker overzichtelijk, en ik vind het persoonlijk mooier

[ Voor 42% gewijzigd door sc0rpz op 15-06-2007 13:11 ]


Verwijderd

Volgens mij kan je van een sting ook het zoveelste karakter opvragen. Eigenlijk dus een string als een array behandelen:

PHP:
1
2
3
$filename = 'abcdefg';
$a = $filename{0}; // geeft a
$b = $filename{1}; // geeft b


Ik heb het niet getest, maar dit zou moeten werken.

  • TwoR
  • Registratie: Augustus 2002
  • Laatst online: 20:38

TwoR

Gekleurde stippen

Verwijderd schreef op vrijdag 15 juni 2007 @ 14:16:
Volgens mij kan je van een sting ook het zoveelste karakter opvragen. Eigenlijk dus een string als een array behandelen:

PHP:
1
2
3
$filename = 'abcdefg';
$a = $filename{0}; // geeft a
$b = $filename{1}; // geeft b


Ik heb het niet getest, maar dit zou moeten werken.
klopt ja, maar dan moet je uiteraard wel blokhaken gebruiken en geen accolades

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
Heel ander punt: dik kans dat de folders met YYYYMMDD formaat aangemaakt zijn om een beetje een handige sortering te hebben. Als je de foldernamen verandert naar DD-MM-YYYY wordt de sortering nogal vreemd. Als je bijvoorbeeld de drie folders 14-01-2005, 31-05-2006 en 01-12-2007 sorteert, levert dit het volgende op:
01-12-2007
14-01-2005
31-05-2006
Dit lijkt mij niet zo praktisch.

When life gives you lemons, start a battery factory


  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

sc0rpz schreef op vrijdag 15 juni 2007 @ 13:10:
[...]


Waarom niet, houdt de code lekker overzichtelijk, en ik vind het persoonlijk mooier
Over dat puntje overzichtelijk valt natuurlijk te discussieren, want dat zijn regexpen over het algemeen nooit, je moet altijd even goed lezen wat er gebeurd. Even snel door de code heen lopen is er dan ook niet bij wat nu wellicht geen probleem is, maar in de toekomst vaak wel.

Verwijderd

TwoR schreef op vrijdag 15 juni 2007 @ 14:18:
[...]


klopt ja, maar dan moet je uiteraard wel blokhaken gebruiken en geen accolades
Volgens mij was het bij een string juist met accolades :) Maar boeit ook verder niet zoveel.

Verwijderd

Erkens schreef op vrijdag 15 juni 2007 @ 15:01:
[...]

Over dat puntje overzichtelijk valt natuurlijk te discussieren, want dat zijn regexpen over het algemeen nooit, je moet altijd even goed lezen wat er gebeurd. Even snel door de code heen lopen is er dan ook niet bij wat nu wellicht geen probleem is, maar in de toekomst vaak wel.
Meestal geef ik dat soort dingen gewoon een eigen functie, dan wordt de functienaam een aanwijzing van wat er gebeurt.

Verwijderd

Verwijderd schreef op vrijdag 15 juni 2007 @ 15:02:
[...]


Volgens mij was het bij een string juist met accolades :) Maar boeit ook verder niet zoveel.
Dat boeit zeker wel heel veel, want blokhaken zijn voor array indexes. En als je variabele dan geen array is gaat php zeuren :+

  • Rac-On
  • Registratie: November 2003
  • Niet online
een string in php is een array van characters. Je kan dus met blokhaken gewoon element 0 tm len-1 opvragen.
substr in deze is minder efficient dan een regex en maar leesbaarder

ik ben het overigens wel met KabouterSuper eens dat je de namen beter kan laten zoals het nu is, idd in verband met leesbaarheid.

doet niet aan icons, usertitels of signatures


  • sc0rpz
  • Registratie: November 2003
  • Laatst online: 23-09-2021
Erkens schreef op vrijdag 15 juni 2007 @ 15:01:
[...]

Over dat puntje overzichtelijk valt natuurlijk te discussieren, want dat zijn regexpen over het algemeen nooit, je moet altijd even goed lezen wat er gebeurd. Even snel door de code heen lopen is er dan ook niet bij wat nu wellicht geen probleem is, maar in de toekomst vaak wel.
Een fatsoenlijke coder zal toch wel comments in zijn code plaatsen dus dat is dan ook weer opgelost.

PHP:
1
2
// Hier een preg_repl om de filename om te zetten in een leesbare datum
preg_replace(.....)

Is nog alijd korter overzichtelijker en efficienter....

  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

Verwijderd schreef op vrijdag 15 juni 2007 @ 14:16:
Volgens mij kan je van een sting ook het zoveelste karakter opvragen. Eigenlijk dus een string als een array behandelen:

PHP:
1
2
3
$filename = 'abcdefg';
$a = $filename{0}; // geeft a
$b = $filename{1}; // geeft b


Ik heb het niet getest, maar dit zou moeten werken.
Deze worden in PHP6 niet meer gebruikt, dus probeer het jezelf maar niet aan te leren. Als je 1 letter wilt verkrijgen, doe dit met substr(). Een goed alternatief is van de string een datum te maken. Dat kan met strtotime():

PHP:
1
echo date("d-m-Y", strtotime("20070615")); // 15-06-2007

Verwijderd

Rac-On schreef op vrijdag 15 juni 2007 @ 16:40:
een string in php is een array van characters. Je kan dus met blokhaken gewoon element 0 tm len-1 opvragen.
substr in deze is minder efficient dan een regex en maar leesbaarder

ik ben het overigens wel met KabouterSuper eens dat je de namen beter kan laten zoals het nu is, idd in verband met leesbaarheid.
Oh, is dat zo? Wat onnetjes van PHP :).

Maarja, weer wat geleerd :+

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

sc0rpz schreef op vrijdag 15 juni 2007 @ 17:09:
Een fatsoenlijke coder zal toch wel comments in zijn code plaatsen dus dat is dan ook weer opgelost.

PHP:
1
2
// Hier een preg_repl om de filename om te zetten in een leesbare datum
preg_replace(.....)
Aan zo'n comment heb ik bijvoorbeeld niks, ik zie daar wat je bedoeling is van de code, maar niet wat het daadwerkelijk doet. Comments in code moeten imo een aanvulling/verduidelijking zijn van een fragment code.
Is nog alijd korter overzichtelijker en efficienter....
regexen zijn niet altijd efficienter, zeker niet als je het met een paar simpele string operaties hetzelfde kan bereiken :)

maargoed /offtopic.

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 01-12 13:11
TwoR schreef op vrijdag 15 juni 2007 @ 14:18:
klopt ja, maar dan moet je uiteraard wel blokhaken gebruiken en geen accolades
Nee hoor, het is een stirng, geen array. Hier horen accolades, ondanks dat blokhaken wel zullen werken.

Hier een regular-expression voor gebruiken lijkt me overkill.

[ Voor 10% gewijzigd door frickY op 15-06-2007 18:54 ]


Verwijderd

Erkens schreef op vrijdag 15 juni 2007 @ 18:20:

[...]

regexen zijn niet altijd efficienter, zeker niet als je het met een paar simpele string operaties hetzelfde kan bereiken :)

maargoed /offtopic.
Ik denk niet dat zo'n (redelijk eenvoudige) regex merkbaar meer resources zal opeisen dan 3 maal een substr selectie maken...

  • Gwaihir
  • Registratie: December 2002
  • Niet online
Verwijderd schreef op vrijdag 15 juni 2007 @ 15:02:
[...]
Volgens mij was het bij een string juist met accolades :)
Inderdaad, was. Ze hebben ingezien dat blokhaken logischer is en 't maar veranderd. Accolades werkt nog wel. Nadat er een tijdje in het manual niets over te vinden was staat 't er nu weer in, met de melding dat het vanaf PHP6 (eindelijk) deprecated zal zijn :) .
Pagina: 1