Conversione grande String torna a Array - PHP
-
19-09-2019 - |
Domanda
[leggi la mia EDIT per una migliore Spiegazione]
Ho bisogno di aiuto con un grande stringa ho.
E 'come questo:
$big_string = "TinteiroID:1#TinteiroLABEL:HP CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#TinteiroID:4#TinteiroLABEL:HP 51633 M#TinteiroREF:51633 M#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:12#FIMPROD#";
E 'come linee di rottura, ma come spazi bianchi.
Se prendiamo un buon aspetto questo è, sono 2 stringhe in questo modo:
$splited_string = "TinteiroID:1#TinteiroLABEL:HP CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#";
Credo che ho bisogno di un preg_split
da ricercare nella $big_string
per questo:
TinteiroID:[only numbers]#TinteiroLABEL:[any character, except "#"]#TinteiroREF:[any character, except "#"]#TinteiroMARCA:[any character, except "#"]#TinteiroGENERO:[any character, except "#"]#TinteiroQUANTIDADE:[only numbers]#FIMPROD#
Ho strisce il $splited_string
e dentro le [] parentesi quadre cito quali caratteri può essere lì.
Al posto delle [] parentesi quadre che dovrebbe essere il token RegExpression per ogni tipo di caratteri che dovrebbe essere accettato. Ma io so poco di questo.
E poi memorizzare ogni $splited_string
in un $array
array.
Qualcuno può dare qualche indizio su come realizzare questo?
Grazie
Modifica
cerco di spiegare la mia logica.
Ho questo grande stringa (senza linea di rottura):
TinteiroID: 1 #
TinteiroLABEL: HP CB335EE #
TinteiroREF: CB335EE #
TinteiroMARCA: HP #
TinteiroGENERO: Tinteiro Preto Reciclado #
TinteiroQUANTIDADE: 23 #
FIMPROD #
TinteiroID: 4 #
TinteiroLABEL: HP 51633 M #
TinteiroREF: 51633 M #
TinteiroMARCA: HP #
TinteiroGENERO: Tinteiro Preto Reciclado #
TinteiroQUANTIDADE: 12 #
FIMPROD #
Possono essere divisi in 2 più piccola stringa.
Con la preg-split ho voluto assegnare ad ogni stringa splited che si assomigliano questi, ma con valori diversi:
TinteiroID:[only numbers]#
TinteiroLABEL:[any character, except "#"]#
TinteiroREF:[any character, except "#"]#
TinteiroMARCA:[any character, except "#"]#
TinteiroGENERO:[any character, except "#"]#
TinteiroQUANTIDADE:[only numbers]#
FIMPROD#
Quindi aggiungere ogni stringa splited a una matrice:
Array
(
[0] => TinteiroID:1#TinteiroLABEL:HP CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#
[1] => TinteiroID:4#TinteiroLABEL:HP 51633 M#TinteiroREF:51633 M#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:12#FIMPROD#
)
E poi ci sarà una per ogni ciclo di andare in ogni oggetto nella matrice. [0] [1] ...
Fare un'altra RegExpression per raccogliere i valori e fare qualcosa con quei valori.
Sì, è "disordinato" e richiede molto CPU, ma .. non avere una migliore ideia: S
Modifica
seguendo il consiglio:
Ho fatto questo codice:
$big_string = "TinteiroID:1#TinteiroLABEL:HP CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#TinteiroID:4#TinteiroLABEL:HP 51633 M#TinteiroREF:51633 M#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:12#FIMPROD#";CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#";
$array = explode("FIMPROD#", $big_string);
print_r ($array);
Si divide il big_string alla alla fine di ogni "FIMPROD #" il delimitatore per ciascuno di essi.
Ora ho andare sulla matrice, e per ogni valore in esso. Fare qualcosa con esso.
Cercherò che ora ... qualcosa caso posterò sono riuscito a farlo o no.
Soluzione
perché avete bisogno di regex qui? perché non basta dividere due volte?
$num = 6; # number of elements to in each splited_string
$out = array();
foreach ($explode('#', $big_string) as $str) {
$tmp = explode(':', $str, 2);
if (count($tmp) == 2) {
$out[] = $tmp[1];
}
}
$subs = intval(count($out) / $num); # how many splited_strings in the big string
for ($i=0; $i<$sub; $i+$num) {
$each_id = array_slice($out, $i, $i+$num); # contains six strings
}
qui ad ogni iterazione, $each_id
conterrebbe sei corde, saresti ancora bisogno di convertire primo e l'ultimo elemento a numeri interi.
Altri suggerimenti
Questo dovrebbe fare allora:
"~TinteiroID:(\d+)#TinteiroLABEL:([^#]+)#TinteiroREF:([^#]+)#TinteiroMARCA:([^#]+)#TinteiroGENERO:([^#]+)#TinteiroQUANTIDADE:(\d+)#FIMPROD#~i"
La difficoltà di utilizzare preg_split () è che ti sembra di richiedere la stringa da raggruppati per due diverse espressioni: \d+
e [^#]+
Credo che si dovrebbe pensare di dividere la stringa in piccolo pezzi e poi mettere un po 'di nuovo insieme.
Cercando di fare la scissione con una sola preg_split () porterà a complicazioni maggiori.
E 'anche difficile vedere le stringhe piena nella tua domanda perché devono essere scorrere a sinistra ea destra.
Modifica:. Sì, come silenzioso fantasma più o meno si dice, non si sta dividendo in un'espressione regolare con [^#]+
, hai veramente bisogno di dividere, o meglio ancora esplodere alla # caratteri
Poi si può mettere l'array di nuovo insieme come due o più stringhe più piccole, forse controllando per 'TinteiroID' come il primo elemento di ciascuna delle stringhe.
Prova il codice qui sotto.
<?php
$str = "TinteiroID:1#TinteiroLABEL:HP CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#TinteiroID:4#TinteiroLABEL:HP 51633 M#TinteiroREF:51633 M#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:12#FIMPROD#";
preg_match_all("/([A-Za-z]+)\:([^#]+)/", $str, $matches);
print_r($matches);
?>
Hai solo bisogno di un regolare /([A-Za-z]+)\:([^#]+)/
espressione con la funzione preg_match_all
per convertire la stringa in un array. Ma non è sicuro se è quello che ti serve.
Il linea PHP regolare tester espressione farà il vostro aiuto.
Lo faccio io ottenere 3 risultati dalla preg_split., Mentre non ci dovrebbero essere 2?
E senza valori?
<?php
$big_string = "TinteiroID:1#TinteiroLABEL:HP CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#TinteiroID:4#TinteiroLABEL:HP 51633 M#TinteiroREF:51633 M#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:12#FIMPROD#";
$array = preg_split("~TinteiroID:(\d+)#TinteiroLABEL:([^#]+)#TinteiroREF:([^#]+)#TinteiroMARCA:([^#]+)#TinteiroGENERO:([^#]+)#TinteiroQUANTIDADE:(\d+)#FIMPROD#~i", $big_string);
print_r ($array);
?>
Output:
Array
(
[0] =>
[1] =>
[2] =>
)