Avatar billede tcru Nybegynder
27. august 2011 - 19:00 Der er 25 kommentarer

PHP ; explode() ?

Hej.

Har fx. sådan en streng her: "  A,B;C,D  "

Jeg kan sagtens få den til at dele den til "A,B og C,D"

Men herefter kan jeg ikke få den til at dele til A B C D..

Hjælp ?
Avatar billede majbom Novice
27. august 2011 - 19:20 #1
<?php
  $str = " A,B;C,D ";
  $str = trim($str);
  $first_part = explode(";", $str);

  foreach($first_part AS $part)
  {
      $second_part[] = explode(",", $part);
  }
}


så har du et to-dimensionelt array...
Avatar billede tcru Nybegynder
27. august 2011 - 19:28 #2
og så smider jeg et while ind eller hvordan?
Planen er at det skal "deles" op hvorefter det skal i sql
Avatar billede arne_v Ekspert
27. august 2011 - 19:45 #3
proev evt.:

$p = preg_split('/[,;]/', $s, 0, PREG_SPLIT_NO_EMPTY);
Avatar billede arne_v Ekspert
27. august 2011 - 19:46 #4
Eller maaske kun:

$p = preg_split('/[,;]/', $s);
Avatar billede tcru Nybegynder
27. august 2011 - 19:56 #5
PT har jeg kodet så længe jeg ikke lige kan fange meningen ?
Kan det ikke laves med 2 x explode(); ?
Avatar billede arne_v Ekspert
27. august 2011 - 20:01 #6
splazz'es loesning er 2 x explode

min loesning er et enkelt preg?split kald som splitter ved begge tegn
Avatar billede tcru Nybegynder
27. august 2011 - 21:47 #7
Svarer imorgen... Har firkantede øjne
Avatar billede majbom Novice
27. august 2011 - 22:58 #8
ja det er sq meget smartere med preg_split - jeg er bare elendig til regex

brug arne's løsning - er sikker på den performer langt bedre!
Avatar billede arne_v Ekspert
28. august 2011 - 01:05 #9
preg_split er kortere kode

det er ikke sikkert at den performer bedre - der sker en masse bagved naar man bruger reegx
Avatar billede tcru Nybegynder
28. august 2011 - 16:54 #10
Jeg er jo lykkelig nu.. :D

Findes der forøvrigt en smartere måde at få skreven et helt array på skærmen uden at skulle blande en while() ind i det ?
Avatar billede majbom Novice
28. august 2011 - 19:04 #11
prøv med:

<pre>
  <?php
      print_r($dit_array);
  ?>
</pre>
Avatar billede tcru Nybegynder
29. august 2011 - 14:06 #12
Hmm.. Jeg var for hurtig...

Ex. på en streng:

"8045,1314568800,16,6,18,83"

Der vil være 287 af disse strenge i ét array.

Det er vel ikke muligt, at hvis ovenstående streng fx. var nummer 10, og jeg skulle tallet "16".. at jeg så bare kan skrive:

$foo[10][2]

?

Syns jeg er ude i noget forfærdeligt array-arbejde.. hehe
Avatar billede majbom Novice
29. august 2011 - 14:15 #13
hvis du bruger en af de løsninger der er post her, burde du ikke have en streng der indeholder kommaer - eller misforstår jeg noget?
Avatar billede tcru Nybegynder
29. august 2011 - 14:19 #14
Måske jeg skulle forklare mig bedre.. :)

Strengen:

"8045,1314568800,16,6,18,83;8045,1314568800,16,6,18,83"

Nu er den bare kopieret...

Den er først ";" separeret ... derefter "," separeret...

Har fundet en løsning, men så ender jeg i en array der slutter på $foo[1721];

- og det er med:
$p = preg_split('/[,;]/', $data, NULL, PREG_SPLIT_NO_EMPTY);


Først skal den separeres med ";"
og herefter ","

således jeg kan smide skidtet i en DB;
Avatar billede tcru Nybegynder
29. august 2011 - 14:20 #15
Grunden til dette er at for hvert ";" separering er én log...
Hver "," er data fra hver log
Avatar billede majbom Novice
29. august 2011 - 14:29 #16
og når du bruger preg_split, bliver det "rodet" sammen i ét stort array...

ville det så ikke være bedre at splitte på ; først og når de skal i databasen, splitter du på , ?
Avatar billede tcru Nybegynder
29. august 2011 - 14:34 #17
Nu er vi på bølgelængde...
Du kan nok fornemme jeg ikke har arbejdet skide meget med arrays.
(Har før brugt tusindvis af variabler hvor arrayes kunne gøre det)

Hvis vi nu antager jeg henter "dataene" direkte fra en fil.

Planen er at de skal direkte i en DB;

Ville du så explode først, og måske preg_split herefter?

Jeg kan ikke putte flere tegn eller andet ind i strengen, da den bliver sendt fra en PLC der bliver afregnet pr. MB.

Jeg kan simpelthen ikke lure en smart måde at gøre det på, uden at få for mange steder der kan opstå fejl.
Avatar billede majbom Novice
29. august 2011 - 14:44 #18
hvis du nøjes med at splitte på ; er det vel fint nok - når du skal smide i databasen skal du alligevel dele værdierne med komma?

INSERT INTO tabel(felt1, felt2, felt3) VALUES(værdi1, værdi2, værdi3)
Avatar billede tcru Nybegynder
29. august 2011 - 14:58 #19
Nooo.... Nu skal du jo ikke skrive noget jeg burde vide.. :'(

$data = noget fra fopen....

$p = explode(";",$data);

INSERT INTO bla VALUES($p);

?

Men nu skal jeg jo stadig blande en while ind i det, for at få alle 287 logs ind ?

$i = 0;
while($i <= 287){
INSERT INTO bla VALUES($p[$i]);
$i++;
}

??
Avatar billede tcru Nybegynder
29. august 2011 - 15:03 #20
Heh... Det her burde koste så mange flere point...

Hvis nu filen fx på et tidspunkt har 287 logs... og andre gange 1024 logs... Kan jeg så lave sådan at scriptet selv kan finde ud af det, uden at jeg skal have min while() til at tælle op til fx. 287 ?
Avatar billede majbom Novice
29. august 2011 - 15:20 #21
du kan jo bruge
count()
på dit array og bruge resultatet af denne i stedet for 287 / 1024 :)
Avatar billede tcru Nybegynder
29. august 2011 - 21:26 #22
Hvorfor får count et andet resultat end det antal arrays der er?
(2 stk i forskel)
Avatar billede majbom Novice
29. august 2011 - 21:33 #23
kunne man forestille sig at der er nogle med tomme strenge i eller noget - hvis følgende virker, er den go nok:

print_r($array(count($array -1)));
Avatar billede tcru Nybegynder
29. august 2011 - 21:36 #24
huh? ik forstået
Avatar billede majbom Novice
29. august 2011 - 22:33 #25
hvordan kommer du frem til at count tæller forkert?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester