Преобразование большой строки обратно в массив - PHP - PullRequest
0 голосов
/ 03 октября 2009

[Проверьте мой EDIT для лучшего объяснения]

Мне нужна помощь с очень большой строкой, которая у меня есть.

Это так:

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

Это как разрывы, но как пробелы.

Если мы хорошо посмотрим, это две строки, подобные этой:

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

Я думаю, мне нужно preg_split для поиска в $big_string для этого:

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

Я выделил $splited_string и в квадратных скобках [] я цитирую, какие символы там могут быть.

Вместо квадратных скобок [] должен быть токен RegExpression для каждого типа символов, которые должны быть приняты. Но я мало что знаю об этом.

А затем хранить каждый $splited_string в массиве $array.

Кто-нибудь может подсказать, как этого добиться?

Спасибо

EDIT:

Я пытаюсь объяснить свою логику.

У меня есть большая строка (без строки разрыва):

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 #

Их можно разбить на 2 строки поменьше.

С preg-split я хотел назначить каждую разделенную строку, которая похожа на эти, но с разными значениями:

TinteiroID:[only numbers]#

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

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

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

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

TinteiroQUANTIDADE:[only numbers]#

FIMPROD#

Затем добавьте каждую разделенную строку в массив:

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

И затем для каждого цикла будет входить каждый объект в массиве. [0] [1] ...

Сделайте еще одно выражение RegExpression, чтобы собрать значения и что-то сделать с этими значениями.

Да, он "грязный" и требует много ресурсов процессора, но .. У меня нет лучшей идеи: S


EDIT:

Следуя советам:

Я сделал этот код:

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

Он разделяет строку big_string в конце каждого "FIMPROD #" разделителя для каждого.

Теперь у меня есть массив, и для каждого значения в нем. Сделай что-нибудь с этим.

Я попробую это сейчас ... Я опубликую что-нибудь, если мне удалось это сделать или нет.

Ответы [ 5 ]

1 голос
/ 05 октября 2009

Попробуйте код ниже.

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

Вам нужно только одно регулярное выражение /([A-Za-z]+)\:([^#]+)/ с функцией preg_match_all для преобразования строки в массив. Но не уверен, что это то, что вам нужно.

Онлайн-тестер регулярных выражений PHP поможет вам.

1 голос
/ 03 октября 2009

зачем вам здесь регулярное выражение? почему бы тебе просто не разделить его дважды?

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

здесь, на каждой итерации, $each_id будет содержать шесть строк, вам все равно потребуется преобразовать первый и последний элементы в целые числа.

1 голос
/ 03 октября 2009

Сложность использования preg_split () состоит в том, что вам, кажется, требуется, чтобы строка была разделена на ДВА различных выражения: \d+ и [^#]+

Я думаю, вам следует подумать о том, чтобы разбить строку на меньшие кусочки, а затем снова собрать их вместе.

Попытка сделать разделение одним preg_split () приведет к большим осложнениям.

Также сложно увидеть полные строки в вашем вопросе, потому что их нужно прокручивать влево и вправо.

Редактировать: Да, как более или менее сказал Silent Ghost, вы не разбиваете регулярное выражение с помощью [^#]+, вам на самом деле нужно разбивать, или, что еще лучше, взрываться в # символах. Затем вы можете собрать массив обратно в две или более строки меньшего размера, возможно, проверив TinteiroID в качестве первого элемента каждой из строк.

1 голос
/ 03 октября 2009

Это должно сделать то:

"~TinteiroID:(\d+)#TinteiroLABEL:([^#]+)#TinteiroREF:([^#]+)#TinteiroMARCA:([^#]+)#TinteiroGENERO:([^#]+)#TinteiroQUANTIDADE:(\d+)#FIMPROD#~i"
0 голосов
/ 03 октября 2009

Я получаю 3 результата из preg_split., А должно быть 2?

А без значений?

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

Выход:

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