Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Конверитировать строку в многомерный массив

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
assd
Отправлено: 23 Мая, 2013 - 15:36:38
Post Id


Гость


Покинул форум
Сообщений всего: 113
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




Здравствуйте. Помогите конвертировать строку вида

PHP:
скопировать код в буфер обмена
  1. name.secondName=val name1.secondName1=val1 name2=val2 name3.secondName3.thirdName3=val3


к виду:

PHP:
скопировать код в буфер обмена
  1. (
  2.      [name] => Array
  3.         (
  4.             [secondName] => val
  5.         ),
  6.      [name1] => Array
  7.         (
  8.             [secondName1] => val1
  9.         ),
  10.       [name2] => val2,
  11.       [name3] => Array
  12.         (
  13.             [secondName3] => Array
  14.                 (
  15.                     [thirdName3] => val3
  16.                 )
  17.  
  18.         )
  19. )


Всем заранее спасибо за помощь)
 
 Top
EuGen Администратор
Отправлено: 23 Мая, 2013 - 16:04:53
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




PHP:
скопировать код в буфер обмена
  1. $sData='name.secondName=val name1.secondName1=val1 name2=val2 name3.secondName3.thirdName3=val3 name.secondName4=val4 name3.secondName2.thirdName6=val6';
  2.  
  3. array('/\s+/', '/^([^\.]+)./', '/\&([^\.]+)./', '/\[([^\[\]\.\=]+)=/', '/\./', '/\[([^\[\]\.\=]+)=/'),
  4. array('&'    , '$1['         , '&$1['         , '[$1]='              , ']['  , '[$1]='),
  5. trim($sData)), $rgData);
  6. //var_dump($rgData);

?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
assd
Отправлено: 23 Мая, 2013 - 16:46:31
Post Id


Гость


Покинул форум
Сообщений всего: 113
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




Спасибо, классно, а если вместо val будет "Что-то написано" или http://test.com, тогда немножко нужно переделать регулярное выражени (я просто в них не силен).
 
 Top
EuGen Администратор
Отправлено: 23 Мая, 2013 - 17:05:40
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Поскольку разбиение идёт по пробельному символу, то присутствие пробелов в значении недопустимо.
Насчёт точек - если они могут присутствовать в значении, то регулярными выражениями слишком громоздко этот контекст разбирать будет. Вероятно, подойдёт:
PHP:
скопировать код в буфер обмена
  1. $sData='name.secondName=val name1.secondName1=val1 name2=www.domain.com name3.secondName3.thirdName3=www.site.ru name.secondName4=val4 name3.secondName2.thirdName6=val6';
  2.  
  3. parse_str(join('&', array_map(function($sChunk)
  4. {
  5.    $rgChunk = explode('=', $sChunk);
  6.    $rgIndex = explode('.', $rgChunk[0]);
  7.    return array_shift($rgIndex).join('', array_map(function($sIndex){return '['.$sIndex.']';}, $rgIndex)).'='.$rgChunk[1];
  8. }, preg_split('/\s+/', $sData))), $rgData);
  9. //var_dump($rgData);


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
assd
Отправлено: 23 Мая, 2013 - 17:18:21
Post Id


Гость


Покинул форум
Сообщений всего: 113
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




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

(Отредактировано автором: 23 Мая, 2013 - 17:19:38)

 
 Top
EuGen Администратор
Отправлено: 23 Мая, 2013 - 17:19:55
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Пишите что угодно, кроме символов, по которым идёт разбиение (пробел в Вашем случае). Можно и регулярным выражением всё собрать в нужный массив, вот только это будет более громоздко, чем разбивать напрямую.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
assd
Отправлено: 23 Мая, 2013 - 17:25:42
Post Id


Гость


Покинул форум
Сообщений всего: 113
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




Спасибо за помощь)
 
 Top
DelphinPRO
Отправлено: 23 Мая, 2013 - 17:26:03
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




ваша строка очень похожа на синтаксис ini-файла
точнее на "продвинутый" ini-файл (с многоуровневыми вложениями).

откуда она берётся?


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
assd
Отправлено: 27 Мая, 2013 - 13:58:49
Post Id


Гость


Покинул форум
Сообщений всего: 113
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




Цитата:
откуда она берётся

незнаю, просто было задание распарсить

А можете объяснить принцып действия метода?
Я так понимаю, parse_str парсит строку и записывает в массив $rgData. Что делает join?
 
 Top
EuGen Администратор
Отправлено: 27 Мая, 2013 - 14:10:42
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




assd пишет:
Что делает join

Известно что - он "склеивает" массив в строку при помощи указанного разделителя. Это нужно потому, что parse_str ожидает строку, как если бы она была передана в качестве URI (например, при вызове скрипта через HTTP-метод GET). Поэтому алгоритм, реализованный в тех строках - таков:
0. Разбить строку в массив по данному разделителю (в Вашем случае это пробельные символы)
1. Обработать каждый элемент получившегося массива, чтобы он принял вид, который будет интерпретирован как индексирование в PHP (заменяем точки на символы "[" и "]" в соответствии с синтаксисом PHP)
2. Соединить уже обработанные элементы-строки воедино через "&" с помощью join
3. Разобрать получившуюся строку через parse_str

В принципе, исходная строка сначала разбивается, а потом склеивается - для удобства, чтобы каждый элемент полученного массива был своим же контекстом - это делает замену пробелов/точек на соответствующие элементы синтаксиса PHP намного проще. Но можно обойтись и без разбиения, заменяя регулярным выражением. Выше я уже писал, что оно будет более громоздим, чем подход с разбиением.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
assd
Отправлено: 27 Мая, 2013 - 15:10:24
Post Id


Гость


Покинул форум
Сообщений всего: 113
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




Цитата:
Обработать каждый элемент получившегося массива, чтобы он принял вид, который будет интерпретирован как индексирование в PHP (заменяем точки на символы "[" и "]" в соответствии с синтаксисом PHP)


А зачем это нужно?
 
 Top
DelphinPRO
Отправлено: 27 Мая, 2013 - 15:13:34
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




вашу исходную строку
CODE (ini):
скопировать код в буфер обмена
  1. name.secondName=val name1.secondName1=val1 name2=val2 name3.secondName3.thirdName3=val3

можно преобразовать к следующему виду
CODE (ini):
скопировать код в буфер обмена
  1. name.secondName=val
  2. name1.secondName1=val1
  3. name2=val2
  4. name3.secondName3.thirdName3=val3

PHP:
скопировать код в буфер обмена
  1. $input = 'name.secondName=val name1.secondName1=val1 name2=val2 name3.secondName3.thirdName3=val3';
  2. $array = explode(' ', $input);

Для такого формата есть парсер на stackoverflow
Используя оттуда функции, можем распарсить буквально в пару строк:
PHP:
скопировать код в буфер обмена
  1. $array = recursive_parse(parse_ini_advanced($array));
  2. var_dump($array);

На выходе получим то, что вам нужно - многоменрый массив.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
EuGen Администратор
Отправлено: 27 Мая, 2013 - 15:15:38
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




assd пишет:
А зачем это нужно?

Чтобы преобразовать строку к виду
PHP:
скопировать код в буфер обмена
  1. nameA[nameB][nameC]=value0&nameD=value1&nameE[nameF]=value2&...


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
assd
Отправлено: 27 Мая, 2013 - 15:19:05
Post Id


Гость


Покинул форум
Сообщений всего: 113
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




PHP:
скопировать код в буфер обмена
  1. nameA[nameB][nameC]=value0&nameD=value1&nameE[nameF]=value2&...

это понятно, что она прийдет к такому виду, а вот зачем нам ее так преобразовывать?
Все понял, потом через parse_str выделим что нужно.

(Отредактировано автором: 27 Мая, 2013 - 15:22:54)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB