[PHP] Zelfde waardes replacen met verschillende waardes

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ChiLLeR
  • Registratie: Januari 2000
  • Laatst online: 20-09 21:33
Ik zit nu toch wel met een ingewikkeld probleem waar ik niet uitkom ook search kan ik het niet vinden.

Ik heb een database waar ik de volgende variabeles uittrek:
PHP:
1
2
$specRegel[$rID] = "$$ vellen consumentenetiket WK$$";
$row["regel"] = "4;26;";

$row["regel"] is dus een puntkomma gescheiden lijst. $specRegel bevat $$ welke staan voor een waarde die in $row["regel"] zijn opgeslagen.
Deze waardes haal ik er als volgt uit:
PHP:
1
$values = split(";", $specRegel[$rID]);

Nu moet mijn script elke $$ vervangen door de respectievelijke waarde in $row["regel"]
Dus ik moet uiteindelijk dit als output krijgen:
PHP:
1
$output = "4 vellen consumentenetiket WK26";

Hoe krijg ik dit voor elkaar. Ik heb al zitten klooien met preg_replace() en arrays maar ik kom er niet uit.
:|
Graag hulp

>> Signature?


Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Als de eerste en eropvolgende waarden in $row steeds overeenkomt met de eerste en eropvolgende $$ kan je de $specregel exploden op $$ en er dan weer een string van maken, waarbij je de huidige waarde van $row er steeds tussen plakt.

Wel even checken of het aantal $$'s met het aantal waarden in $row overeenkomt natuurlijk. :)

Sundown Circus


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Als je preg_match gebruikt, dan krijg je een array van matches terug. Die kun je om de beurt vervangen op jouw manier. Maar mag ik zo vrij zijn om te zeggen dat je het nogal vreemd aanpakt? :?

'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!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

Die $$ zitten steeds op een andere plaats, of steeds aan het begin en aan het einde van de string?

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

NMe84 schreef op 23 juni 2004 @ 13:27:
Als je preg_match gebruikt, dan krijg je een array van matches terug. Die kun je om de beurt vervangen op jouw manier. Maar mag ik zo vrij zijn om te zeggen dat je het nogal vreemd aanpakt? :?
Het datamodel laat inderdaad wel te wensen over. :)

[ Voor 75% gewijzigd door RedRose op 23-06-2004 13:29 ]

Sundown Circus


Acties:
  • 0 Henk 'm!

  • ChiLLeR
  • Registratie: Januari 2000
  • Laatst online: 20-09 21:33
OkkE schreef op 23 juni 2004 @ 13:27:
Die $$ zitten steeds op een andere plaats, of steeds aan het begin en aan het einde van de string?
Steeds op een andere plaats.
RedRose schreef op 23 juni 2004 @ 13:28:
[...]


Het datamodel laat inderdaad wel te wensen over. :)
Ja het is ook lastig ik kon niet echt een andere datamodel bedenken. Het probleem is gewoon dat er dus in elke regel meerdere instanties van $$ kunnen voorkomen. En dat daarvoor de waardes ergens opgeslagen moeten worden.

[ Voor 6% gewijzigd door ChiLLeR op 23-06-2004 13:35 ]

>> Signature?


Acties:
  • 0 Henk 'm!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

ChiLLeR schreef op 23 juni 2004 @ 13:34:
[...]

Steeds op een andere plaats.


[...]

Ja het is ook lastig ik kon niet echt een andere datamodel bedenken. Het probleem is gewoon dat er dus in elke regel meerdere instanties van $$ kunnen voorkomen.
Was ik al bang voor, zaten ze steeds op de zelfde plek was het iets makkelijker. :)

Maar is niet niet mogelijk de tweede set $$ te vervangen door bijv. ## ofzo? Of vertel anders iets meer over de werking? Wat voor gegevens zijn het, waarom kunnen de cijfers niet in de string enz? Misschien kunnen wij je helpen met een iets beter datamodel...

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

En daarnaast, is het mogelijk voor jou om die $$ aan te passen in iets anders, of om het script aan te passen, of ben je afhankelijk van anderen en eventuele restricties? Zo niet, dan moet je gewoon opnieuw beginnen met ontwerpen. :)

Sundown Circus


Acties:
  • 0 Henk 'm!

Verwijderd

Ranzig, maar alsje:

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

$specRegel = '$$ vellen consumentenetiket WK$$'; 
$row = '4;26;';

function formatString($s, $r, $d = '$$') {
  $a = explode(';', $r);

  for ($i = 0; $i < sizeOf($a); $i++) {
    if (($iPos = strpos($s, $d)) === false) {
      break;
    }
    $s = substr($s, 0, $iPos) . $a[$i] . substr($s, $iPos + strlen($d));
  }
  return $s;
}

echo formatString($specRegel, $row);

?>

[ Voor 24% gewijzigd door Verwijderd op 23-06-2004 14:03 ]


Acties:
  • 0 Henk 'm!

  • ChiLLeR
  • Registratie: Januari 2000
  • Laatst online: 20-09 21:33
Oke ik ga het uitleggen wat er gevraagd wordt.
Het is een spec systeem om productie gegevens te genereren en op te slaan wat nu gebeurt in word documenten maar dat schiet natuurlijk niet op.
Er zijn nu de volgende tabellen:

spec:
specIDextensieartikelnummerartikelnaam
3038843-038gouda 48%


spec_regel:
spec_regelIDspecIDregelIDvalue
1354;26;
238engels


regels:
regelIDrankregelchoices
545$$ vellen consumentenetiket WK$$NULL
855Weegetiket met taalcode $$ op kaasengels;duits;frans;


Extensie uit de tabel spec is verder gekoppelt aan een paar klant tabellen maar dat is niet interessant voor dit gedeelte. Een klant (extensie) kan dus meerdere specs hebben die dus per artikel zijn opgeslagen in tabel spec. De regels die hierbij horen zijn dus opgeslagen in de tabel spec_regel wat dus eigenlijk dient als relatie tabel. De tabel regels bevat alle mogelijke regels die een spec kan bevatten.
In deze tabel regels zit een extra kolom choices omdat het mogelijk kan zijn dat een regel alleen vaste waardes kan bevatten als deze null is word het een invul veld en anders een dropdownbox met de waardes uit choices.

Ik hoop dat er nu wat duidelijkheid is. Ik sta open voor ideeen.

>> Signature?


Acties:
  • 0 Henk 'm!

  • RwD
  • Registratie: Oktober 2000
  • Niet online

RwD

kloonikoon

Kun je niet "foreach in je gesplitte variabele een ereg_replace" doen op de string, en de eerste $$ blijven vervangen totdat je klaar bent??

Dan ben je met drie/vier regels code wel klaar...

***edit***
zoiets dus:
PHP:
1
2
3
4
5
<?php
$values = split(";", $specRegel[$rID]);
foreach( $values as $value )
    $vervangstring = ereg_replace( '([^\$]*)\$\$', '\1'.$value, $vervangstring );
?>


Let wel, de reguliere expressie is fout voor het doel, het gaat even om het principe

[ Voor 45% gewijzigd door RwD op 23-06-2004 14:12 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Wat voor ideeen? Mijn vorige reply is een oplossing op de vraag die je stelt in je openingspost. Daarmee is toch de kous af?

Acties:
  • 0 Henk 'm!

  • ChiLLeR
  • Registratie: Januari 2000
  • Laatst online: 20-09 21:33
Verwijderd schreef op 23 juni 2004 @ 14:05:
Wat voor ideeen? Mijn vorige reply is een oplossing op de vraag die je stelt in je openingspost. Daarmee is toch de kous af?
Ja bedankt daarvoor ik ga het even proberen maar zoals je zelf al zegt 'ranzig'. Inderdaad Jorgen het werkt, thanx ik kan iig verder.
Daarom mijn reactie op dit:
OkkE schreef op 23 juni 2004 @ 13:36:
[...]

Was ik al bang voor, zaten ze steeds op de zelfde plek was het iets makkelijker. :)

Maar is niet niet mogelijk de tweede set $$ te vervangen door bijv. ## ofzo? Of vertel anders iets meer over de werking? Wat voor gegevens zijn het, waarom kunnen de cijfers niet in de string enz? Misschien kunnen wij je helpen met een iets beter datamodel...

[ Voor 7% gewijzigd door ChiLLeR op 23-06-2004 14:11 ]

>> Signature?


Acties:
  • 0 Henk 'm!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

Verwijderd schreef op 23 juni 2004 @ 14:05:
Wat voor ideeen? Mijn vorige reply is een oplossing op de vraag die je stelt in je openingspost. Daarmee is toch de kous af?
Dat was denk ik een reactie op mijn post, waarin ik vroeg waar het systeem voor bedoeld was. En hoe het er uit zag, om te kijken of het datamodel misschien aangepast kan worden. :)

Edit: te laat..

Edit2: Hmm ik heb nu heel even naar je datamodel gekeken, maar zo 123 kan ook niets beters verzinnen. Maar ik blijf het wel een beetje raar systeem vinden..

[ Voor 21% gewijzigd door OkkE op 23-06-2004 14:17 ]

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

ChiLLeR schreef op 23 juni 2004 @ 14:08:
[...]


Ja bedankt daarvoor ik ga het even proberen maar zoals je zelf al zegt 'ranzig'. Inderdaad Jorgen het werkt, thanx ik kan iig verder.
Daarom mijn reactie op dit:


[...]
Ok, ik ben bang dat je toch dingen uit elkaar moet gaan trekken. Maak je dit systeem alleen? Zoek allereerst eens op GoT en Google naar template systemen en hoe variabelen te vervangen enzo. Probeer ook voor jezelf eens een logisch datamodel op te stellen: wat hoort er wel in thuis en wat niet? Zoek nog even de normaliseren-tutorial op. Tot zover. ;) Maar zoals gezegd: als het een al bestaand systeem is: kijk voor jezelf of je de tijd kwijt wil zijn aan dergelijk werk. :)

Sundown Circus


Acties:
  • 0 Henk 'm!

  • ChiLLeR
  • Registratie: Januari 2000
  • Laatst online: 20-09 21:33
RedRose schreef op 23 juni 2004 @ 14:26:
[...]


Ok, ik ben bang dat je toch dingen uit elkaar moet gaan trekken. Maak je dit systeem alleen? Zoek allereerst eens op GoT en Google naar template systemen en hoe variabelen te vervangen enzo. Probeer ook voor jezelf eens een logisch datamodel op te stellen: wat hoort er wel in thuis en wat niet? Zoek nog even de normaliseren-tutorial op. Tot zover. ;) Maar zoals gezegd: als het een al bestaand systeem is: kijk voor jezelf of je de tijd kwijt wil zijn aan dergelijk werk. :)
Ja ik maak dit systeem alleen en vanaf scratch. In mijn opzicht leek me dit wel een goed idee maar ik heb ook niet echt een idee om het anders op te slaan.

>> Signature?


Acties:
  • 0 Henk 'm!

Verwijderd

Voor de aardigheid nog een oplossing:

PHP:
1
2
3
4
5
6
7
8
<?php
$specRegel[$rID] = "$$ vellen consumentenetiket WK$$";
$row["regel"] = "4;26;";

$values = explode(';', $row['regel']);

$output = preg_replace('/\$\$/e', 'array_shift($values)', $specRegel[$rID]);
?>

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Nog eentje:
PHP:
1
2
3
$values = explode(';', $row['regel']);
$regel = str_replace('$$', '%s', $specRegel[$rID]);
$output = vsprintf($regel, $values);


Als je er gelijk %s-jes van maakt ipv $$'s is het nog makkelijker :P ('t Leuke is dat je dan de volledige kracht van printf kan gebruiken voor formatting, dus ook comma-getallen afronden enzo)

[ Voor 22% gewijzigd door ACM op 23-06-2004 17:44 ]

Pagina: 1