Array geri büyük dize dönüştürme - PHP

5 Cevap php

[Check My EDIT for better Explanation]

Ben var çok büyük bir dize ile biraz yardıma ihtiyacım var.

Onun böyle:

$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 #";

Hiçbir kırılma hatları gibi, ama o kadar beyaz boşluk.

Bu iyi bir göz atacak olursak, bunun gibi 2 dizeleri:

$splited_string = "TinteiroID: 1 #TinteiroLABEL: HP CB335EE #TinteiroREF: CB335EE #TinteiroMARCA: HP #TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE: 23 #FIMPROD #";

Ben bunun için $big_string aramak için bir preg_split gerektiğini düşünüyorum:

TinteiroID:[only numbers]#TinteiroLABEL:[any character, except "#"]#TinteiroREF:[any character, except "#"]#TinteiroMARCA:[any character, except "#"]#TinteiroGENERO:[any character, except "#"]#TinteiroQUANTIDADE:[only numbers]#FIMPROD #

Ben $splited_string çizgili ve [] köşeli parantez içinde ben orada olabilir hangi karakterler alıntı.

Bunun yerine [] köşeli parantez içinde, kabul edilmesi gereken karakter her türü için RegExpression belirteç olmalıdır. Ama ben bu konuda çok az şey biliyoruz.

Ve daha sonra bir dizideki her bir $splited_string depolamak $array.

Herkes bunu gerçekleştirmek için nasıl bazı ipuçları verebilir misiniz?

Teşekkürler

EDIT:

Ben mantığını anlatmaya çalışacağım.

(Hiçbir kırılma hattı ile) bu büyük dizesi vardır:

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 #

Bunlar 2 küçük dize bölünebilir.

Gebelik bölünmüş i hem bu olanları bakmak her splited dize atamak istedi, ancak farklı değerlerle:

TinteiroID:[only numbers]#

TinteiroLABEL:[any character, except "#"]#

TinteiroREF:[any character, except "#"]#

TinteiroMARCA:[any character, except "#"]#

TinteiroGENERO:[any character, except "#"]#

TinteiroQUANTIDADE:[only numbers]#

FIMPROD #

Sonra bir dizi için her splited dizeyi ekleyin:

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 #
)

Ve sonra her döngü dizideki her nesnenin bir oraya gitmek olacaktır için. [0] [1] ...

Değerleri toplamak ve bu değerler ile bir şeyler yapmak için başka RegExpression yapmak.

Evet onun "dağınık" ve çok fazla CPU alır ama .. ben daha iyi bir ideia yok: S


EDIT:

Following the Advice:

Ben bu kodu yaptım ettik:

$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);

It splits the big_string to the at the end of each "FIMPROD #" the Delimiter for each one.

Şimdi ben dizi gitmek ve onun içinde her değer için var. Onunla bir şeyler yapmak.

Ben şimdi çalışacağım ... Ben bunu yapmak ya da değil yönetilen bir şey davayı yayınlayacağız.

5 Cevap

neden burada Regex gerekiyor? neden sadece iki kez bölmek değil mi?

$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
}

Burada her tekrarda, $each_id altı dizeleri içerecektir, yine tamsayılar için ilk ve son elemanları dönüştürmek gerekiyordu.

Bu daha sonra yapmanız gerekir:

"~TinteiroID:(\d+)#TinteiroLABEL:([^#]+)#TinteiroREF:([^#]+)#TinteiroMARCA:([^#]+)#TinteiroGENERO:([^#]+)#TinteiroQUANTIDADE:(\d+)#FIMPROD#~i"

\d+ ve [^#]+: preg_split kullanmanın zorluğu () Eğer dize İKİ farklı ifadeler ile bölünmüş gerektirir gibi görünüyor olduğunu

Sana smaller parçalar halinde dize bölme ve daha sonra tekrar bir araya bazı koyarak düşünmelisiniz düşünüyorum.

Bir preg_split ile bölünmüş yapmaya çalışıyor () büyük komplikasyonlara yol açacaktır.

Bunların sol ve sağ kaydırılan zorunda çünkü söz tam dizeleri görmek de zor.

Edit: Yes, as Silent Ghost more or less said, you're not splitting on a regular expression with [^#]+, aslında bölmek gerekir, ya da daha iyisi # karakter patlayabilir.

Sonra belki dizelerin her ilk unsuru olarak 'TinteiroID için' kontrol ederek iki veya daha küçük dizeleri olarak tekrar bir araya dizi koyabilirsiniz.

Aşağıdaki kodu deneyin.

 <?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);
    ?>

Sen yalnızca bir diziye dize dönüştürmek için preg_match_all fonksiyonu ile bir düzenli ifade /([A-Za-z]+)\:([^#]+)/ gerekir. Ama ihtiyacınız ne ise emin olun.

online PHP regular expression tester sizin yardımınıza yapacağız.

Ben preg_split 3 sonuç alabilirim. 2 olması gerekirken?

Ve hiçbir değerlerle?

<?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);
?>

Çıktı:

Array
(
    [0] => 
    [1] => 
    [2] => 
)