Мне нужно передать данные в массив блоками, как я могу это сделать? Нужно ли использовать регулярное выражение? Мой скрипт дает мне ошибки, потому что я не могу отделить его, как я желаю. У кого-нибудь есть идеи?Как разобрать строку на многомерный массив (regex?)
данных:
~0
11111111
~1
222222222
~2
3333333333
~end
~0
aaaaaaaaaaa
~1
bbbbbbbbbb
~2
cccccccccc
~3
ddddddddddd
~end
~0
yyyyyyyyyyy
xxxxxxxx
ffffffffff
~1
rrrrrrrrrrrr
~end
мне это нужно так:
Array (
[0] => Array
(
[0] => 11111111
[1] => 222222222
[2] => 3333333333
)
),
[1] => Array
(
[0] => aaaaaaaaaaa
[1] => bbbbbbbbbb
[2] => cccccccccc
[3] => ddddddddddd
)
),
[2] => Array
(
[0] => yyyyyyyyyyy
xxxxxxxx
ffffffffff
[1] => rrrrrrrrrrrr
)
),
)
Мой код (неудовлетворительно):
$texto = "~0
11111111
~1
222222222
~2
3333333333
~end
~0
aaaaaaaaaaa
~1
bbbbbbbbbb
~2
cccccccccc
~3
ddddddddddd
~end
~0
yyyyyyyyyyy
xxxxxxxx
ffffffffff
~1
rrrrrrrrrrrr
~end";
preg_match_all("/(?ms)^~0.*?~end/", $texto, $coincidencias);
foreach ($coincidencias[0] as $bloque){
preg_match_all("/\~.*\n/", $bloque, $sub_bloques);
$hola[] = $sub_bloques;
}
Я не уверен, что я правильно понял требования, не могли бы вы подтвердить? «Каждая непустая строка NOT, начинающаяся с caracter ~, должна быть одной записью в массиве« – Dragos
@Dragos от «~ 0» до «~ end» - это один блок (теперь они 3 блока) и на каждый текст блока ~ 0, ~ 1, ~ 2 до позиции массива (только текст) –
Я предпочел бы работать в 2 этапа: 1. '$ level1 = explode ('~ end', $ data)' 2. 'foreach ($ level1 в качестве $ subItem) {$ matches = preg_match_all ('^ (\ w *) $', $ subItem)} ' – Dragos