Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Распарсить массив строк, и положить все в новый массив 
V
    Опции темы
Guedda
Дата 25.12.2012, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 13
Всего: 78



Добрый день, уважаемые.
Столкнулся со следующей проблемой.
Есть, допустим, массив:
Цитата

array(5) {
  [0] => "ACTION.MONDAY.235.4141",
  [1] => "ACTION.MONDAY.235.3737",
  [2] => "ACTION",
  [3] => "ACTION.MONDAY",
  [4] => "ACTION.TUESDAY.112.2345",
  [5] => "ACTION.TUESDAY.456.7842",
}

На выходе мне необходимо получить следующий массив:
Цитата

$arr['ACTION']['MONDAY']['235']['4141'] = "";
$arr['ACTION']['MONDAY']['235']['3737'] = "";
$arr['ACTION']['TUESDAY']['112']['2345'] = "";
$arr['ACTION']['TUESDAY']['456']['7842'] = "";

Тобишь, чтобы результирующие ключи были подстроками, через точку.
Надеюсь подробно объяснил. И вот сижу, ничего мудрого придумать не могу. Задача осложняется тем, что в строке может быть сколь угодно много разделений (прим.: "ACTION.MONDAY.235.3231.12551.1.234.231", и на выходе должно получиться $arr['ACTION']['MONDAY'][235][3231][12551][1][234][231]) 
Как-то так.
Может кто уже сталкивался с таким и есть готовое решение? Просто уже всю предновогоднюю голову сломал, так и не нахожу решения.

Заранее благодаре за ответы.


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
StachelDraht
Дата 25.12.2012, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Не Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 19.1.2006

Репутация: 1
Всего: 1



explode() ????
PM MAIL   Вверх
Guedda
Дата 25.12.2012, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 13
Всего: 78



Цитата(StachelDraht @  25.12.2012,  14:10 Найти цитируемый пост)
explode() ???? 

explode создает массив типа такого:
Цитата

[0] => "ACTION"
[1] => "MONDAY"

и так далее...
Поэтому мне не очень подходит. Или приведите пример? А то я не очень понимаю.


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
ksnk
Дата 25.12.2012, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цикл по исходному массиву, explode значения, цикл по результату эксплода и складировать все в массив. Какие такие готовые решения?  smile 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Guedda
Дата 25.12.2012, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 13
Всего: 78



Цитата(ksnk @  25.12.2012,  14:32 Найти цитируемый пост)
Цикл по исходному массиву, explode значения, цикл по результату эксплода и 

До этого я допетрил и сам )))) а вот:
Цитата(ksnk @  25.12.2012,  14:32 Найти цитируемый пост)
складировать все в массив

Даже не представляю, что делать smile Ну подскажи, я знаю - ты умный.

Цитата(ksnk @  25.12.2012,  14:32 Найти цитируемый пост)
Какие такие готовые решения?   

Имеется ввиду, может кто уже такое делал, и у него где-нибудь наработки остались.
У меня в данном случае есть следующее:
Код

foreach ($list as $list_element) {
    $arr = array();
    $tmp_res = explode(".", $list_element);
    foreach ($tmp_res as $value) {
       // и вот здесь что делать, ума не приложу. :)
    }
}



--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
baldina
Дата 25.12.2012, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



Код

foreach ($list as $list_element) {
    $arr = array();
    $tmp_res = explode(".", $list_element);
    $tmp_arr = &$arr;
    foreach ($tmp_res as $value) {
       $tmp_arr[$value] = "";
       $tmp_arr = &$tmp_arr[$value];
    }
}


Добавлено через 52 секунды
если данные надежные проще и короче eval

Добавлено через 5 минут и 18 секунд
только $arr = array(); нужно вынести наружу, ведь итоговый массив должен быть один
PM MAIL   Вверх
ksnk
Дата 25.12.2012, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Код

$list = array (
    "ACTION.MONDAY.235.4141",
    "ACTION.MONDAY.235.3737",
    "ACTION",
    "ACTION.MONDAY",
    "ACTION.TUESDAY.112.2345",
    "ACTION.TUESDAY.456.7842",
);

$arr = array();
    
foreach ($list as $list_element) {
    $tmp_res = explode(".", $list_element);
    $cur=&$arr;
    if(count($tmp_res )>0){
        $last=array_pop($tmp_res );
        if(count($tmp_res )>0){
           foreach ($tmp_res as $value) {
              //$cur - array!
              if(!array_key_exists($value,$cur) || ''===$cur[$value])
                 $cur[$value]=array();
              $cur=&$cur[$value];
           }
        } 
        if(!array_key_exists($last,$cur))
              $cur[$last]='';
    }
    unset($cur);
}
echo "<pre>";
var_export($arr );



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Guedda
Дата 25.12.2012, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 13
Всего: 78



Цитата(baldina @  25.12.2012,  15:18 Найти цитируемый пост)
только $arr = array(); нужно вынести наружу, ведь итоговый массив должен быть один 

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

array(1) {
  ["ACTION"]=>
  array(1) {
    ["TUESDAY"]=>
    array(1) {
      [456]=>
      array(1) {
        [7842]=>
        &string(0) ""
      }
    }
  }
}

Вот код:
Код

$arr = array();
foreach ($list as $list_element) {
    $tmp_res = explode(".", $list_element);
    $tmp_arr = &$arr;
    foreach ($tmp_res as $value) {
       $tmp_arr[$value] = "";
       $tmp_arr = &$tmp_arr[$value];
    }
}
var_dump($arr);



--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
baldina
Дата 25.12.2012, 15:22 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



ну да, накосячил... данные заменяются. надо так:
Код

$arr = array();
foreach ($list as $list_element) {
    $tmp_arr = &$arr;
    foreach (explode(".", $list_element) as $value) {
       if (!isset($tmp_arr[$value]))
         $tmp_arr[$value] = "";
       $tmp_arr =& $tmp_arr[$value];
    }
}

PM MAIL   Вверх
Guedda
Дата 25.12.2012, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 13
Всего: 78



Супер, спасибо огромное! 


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0995 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.