
Главная /Internet/Programming/ PHP как превратить строку в многомерный массив?
Привет! Есть строка, например car(audi(rx7,rx8),mazda),soda(sprite,cola), нужно из нее сделать массив Код: Array ( [car] => Array ( [audi] => Array ( [rx7] => [rx8] => ) [mazda] => ) [soda] => Array ( [sprite] => [cola] => ) ) roddik как это лучше всего сделать? писать парсер. работает, спасибо roddik работает, спасибо а давайте без сарказма? если нашли другое решение - указывайте. roddik Писать рекурсивную функцию, либо если количество вложений ограничено, то и без нее обойтись можно. Разбивайте строку функцией explode по запятой, прогоняйте полученный массив через foreach, если в элементе встречается ( скобки (preg_match), то разбивайте его снова и снова через foreach. Ну и полученные массивы, вкладывайте один в другой, в точности как вам это надо. Ternik азбивайте строку функцией explode по запятой Задача в реале не такая простая
Что бы разбить по запятой надо точно определить какие запятые на данные момент разбивают этот уровень, а какие из вложенного
Банальным регулярным выражением здесь не обойтись, вот сейчас пытаюсь решить задачу ... (решил с утра кому-то сделать добро
) п.с. Помню похожая задача была на одной из олимпиад по информатике
мне бы тогда тот опыт который у меня сейчас ... Добавлено: п.п.с. Главную проблему здесь создает тот факт что некоторые саб массивы могут быть пустыми, как например mazda. Добавлено: Вот вам решение, правда советую протестировать на все возможные критические ситуации
Код: <?php $testLine = 'car(audi(rx7,rx8),mazda),sample,soda(sprite,cola)'; function SplitStr($string) { $pieces = array(); $bracketState = 0; $startPos = 0; $checkBracketState = false; for ($i=$startPos; $i<strlen($string); $i++) { if ($string[$i] == '(') { $checkBracketState = true; $bracketState += 1; } if ($string[$i] == ')') $bracketState -= 1; // if we have empty array element (bracket was not opened yet) if ((!$checkBracketState)and($string[$i] == ',')) { $pieces[] = substr($string, $startPos, $i-$startPos); $startPos = $i+1; } // if we have empty array element at the end of string if ((!$checkBracketState)and($i+1 == strlen($string))) { $pieces[] = substr($string, $startPos, $i-$startPos+1); } if (($checkBracketState)and($bracketState == 0)) { $pieces[] = substr($string, $startPos, $i-$startPos+1); // increase starPos with two to skip ")," $startPos = $i+2; $checkBracketState = false; $i += 1; } } return $pieces; } function StrToArray($string) { $subArray = array(); // split string to array elements $arrayPieces = SplitStr($string); // extract each elements name and its value foreach ($arrayPieces as $arrayPeice) { if (preg_match('#(\w*)(?:\((.*)\)|)#', $arrayPeice, $matches)) { $subArray[$matches[1]] = isset($matches[2]) ? StrToArray($matches[2]) : array(); } } return $subArray; } var_dump(StrToArray($testLine)); ?> Сам парсинг несложный, вот у меня только затруднения с формированием этого массива. Код: <pre> <? function strtoarr($str) { $lev = 1; $name = ''; for ($i = 0; $i < strlen($str); $i++) { if ($str[$i] == '(' || $str[$i] == ')' || $str[$i] == ',') { if ($name == '') continue; for($k = 0; $k < $lev; $k++) echo "\t"; echo "$name\n"; $name = ''; if ($str[$i] == '(') $lev++; if ($str[$i] == ')') $lev--; continue; } $name .= $str[$i]; } } strtoarr('car(audi(rx7,rx8),mazda),soda(sprite,cola)'); ?> </pre> Спасибо большое)) правда я когда "работает, спасибо" писал уже свое сочинил, вот, для компании
Код: function toarr($input, $prefix = '') { if (!$prefix) $input = preg_replace('#[^\w\d\(\), ]#', '', $input); $word=''; for ($i=0;$i<strlen($input);$i++) { $letter = $input[$i]; if ($letter == ',') { if ($word) $res[] = $prefix.$word; $word = ''; } elseif ($word && $letter == '(') { $opened = 1; $subinput = ''; for ($i = $i+1; $i<strlen($input); $i++) { $letter = $input[$i]; if ($letter == '(') $opened++; elseif ($letter == ')') $opened--; if (!$opened) break; $subinput .= $letter; } $res[] = $prefix.$word; $res = array_merge($res, toarr($subinput, $prefix.$word.'/')); $word = ''; } else { $word .= $letter; if ($i == strlen($input)-1) $res[] = $prefix.$word; } } return $res; }
PHP как превратить строку в многомерный массив?
Продвижение по одному слову
teh.com.ua
Свальный грех
Как изменить дату?
Nissan Maxima, Cefiro
Скачать Warcraft Frozen Trone
Продукты компании Schlumberger
Проблема с микрофоном в Linux
Перенаправление с стационара или всегда на связи с клиетами!
Иисус / The Jesus
UPS LUXEON
board - drom - sexnarod - nulled
Архивы форумов - forum-arch.su
RuBoard