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]   

> Без описания
jonston
Отправлено: 05 Августа, 2017 - 18:14:26
Post Id



Посетитель


Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011  


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




Как из этого
PHP:
скопировать код в буфер обмена
  1.  
  2.        $array = [
  3.             'users[foo][bar]' => 'message 1',
  4.             'users[foo][1][bar]' => 'message 2',
  5.             'users[some][2]' => 'message 3',
  6.             'name[foo]' => 'message 4'
  7.         ];
  8.  

Получить такое?
PHP:
скопировать код в буфер обмена
  1.  
  2.         $array = [
  3.             'users' => [
  4.                 'foo' => [
  5.                     'bar' => 'message 1',
  6.                     1 => [
  7.                         'bar' => 'message 2'
  8.                     ],
  9.                 ],
  10.                 'some' => [
  11.                     2 => 'message 3'
  12.                 ]
  13.             ],
  14.             'name' => [
  15.                 'foo' => 'message 4'
  16.             ]
  17.         ];
  18.  

(Отредактировано автором: 05 Августа, 2017 - 18:14:59)



-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
Sail
Отправлено: 05 Августа, 2017 - 20:56:53
Post Id



Участник


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


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




jonston, вот ещё вариантик:
Спойлер (Отобразить)

(Добавление)
unset($var) добавил... дабы хвост ссылки убарть...

(Отредактировано автором: 05 Августа, 2017 - 20:59:00)

 
 Top
Строитель Модератор
Отправлено: 05 Августа, 2017 - 21:16:39
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


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




Sail, я своё удалил, т.к. структура массива не правильная получилась.
(Добавление)
Sail, на основе вашего алгоритма переписал свой пример
Спойлер (Отобразить)
Радость
 
 Top
LIME
Отправлено: 05 Августа, 2017 - 22:50:59
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




да вы гоните
eval
не?
 
 Top
Мелкий Супермодератор
Отправлено: 05 Августа, 2017 - 23:07:08
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Не, eval evil.

PHP:
скопировать код в буфер обмена
  1. $array = [
  2.     'users[foo][bar]' => 'message 1',
  3.     'users[foo][1][bar]' => 'message 2',
  4.     'users[some][2]' => 'message 3',
  5.     'name[foo]' => 'message 4'
  6. ];
  7. $out = [];
  8. foreach ($array as $fullkey => $val) {
  9.     $tmp = &$out;
  10.     foreach (preg_split('~[\[\]]+~', $fullkey, -1, PREG_SPLIT_NO_EMPTY) as $keypart) {
  11.         if (! isset($tmp[ $keypart ])) {
  12.             $tmp[ $keypart ] = [];
  13.         }
  14.         $tmp = &$tmp[ $keypart ];
  15.     }
  16.     $tmp = $val;
  17. }
  18. unset($tmp);
  19.  
  20. var_dump($out);

Для любой вложенности но без контроля ошибок во входной последовательности.


-----
PostgreSQL DBA
 
 Top
LIME
Отправлено: 05 Августа, 2017 - 23:18:33
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




зависит от задачи
имхо тут большее зло регулярки чем eval
всмысле нафига
я за более простую описательность кода в данном случае
(Добавление)
ну если уж совсем против евала то почему бы не json_decod после небольшой переделки данных
вариант?
Мелкий согласись это будет необычное но в чемто красивое и безопасное решение?)) ась?))
 
 Top
Мелкий Супермодератор
Отправлено: 05 Августа, 2017 - 23:42:34
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




регулярка или eval с точки зрения сопровождения кода - для меня вообще не вопрос, простая регулярка очень сильно проще.
Плюс регулярка безопасна для любых входных данных и не будет делать глупости. Да и для eval всё равно данные процессить предварительно, кавычки подставлять хотя бы, чтобы на константу не напороться и E_NOTICE не провоцировать, для top-level добавлять скобки. Многовато проблем вижу на ровном месте. А избегать регулярку ради регулярки - explode по [ и rtrim ] достаточный и забавный способ.

Или я туплю или до json тут формат ещё пилить и пилить.
Но сможешь сделать компактнее - вперёд, устроим кодгольф Тусовка


-----
PostgreSQL DBA
 
 Top
LIME
Отправлено: 05 Августа, 2017 - 23:48:53
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




насчет евала соглашусь
убедил
хотя опятьже мало инфы по задаче
в общем случае конечно зло и я прекрасно понимаю все минусы но в данном конкретном почему не да
---
по идее с json
меняем [] на точки
кавычки на двойные
=> на двоеточие
я ничего не забыл?
ну и вуаля
имхо есть в этом решении красота
описательно проще и без зла
(Добавление)
найду время напишу
будет тебе подача)
жди

(Отредактировано автором: 05 Августа, 2017 - 23:50:00)

 
 Top
Ch_chov
Отправлено: 06 Августа, 2017 - 07:25:51
Post Id



Постоянный участник


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


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




(Отредактировано автором: 06 Августа, 2017 - 07:37:40)

 
 Top
Мелкий Супермодератор
Отправлено: 06 Августа, 2017 - 09:49:10
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Ch_chov, отлично! Превосходно
До меня тоже ночью дошло, что же мне напоминает формат


-----
PostgreSQL DBA
 
 Top
LIME
Отправлено: 06 Августа, 2017 - 10:01:06
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




Ch_chov точно)
 
 Top
jonston
Отправлено: 06 Августа, 2017 - 22:59:12
Post Id



Посетитель


Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011  


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




Красава!Спасибо большое!

(Отредактировано автором: 06 Августа, 2017 - 23:12:12)



-----
$i = 0;
$i = $i++ + ++$i; ?
 
 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